왜 Mockito는 정적 방식을 조롱하지 않는 거죠?
여기서 스태틱 메서드에 대한 몇 가지 스레드를 읽었는데 스태틱 메서드를 잘못 사용하거나 과도하게 사용하면 발생할 수 있는 문제를 알 수 있을 것 같습니다.하지만 정적 방법을 조롱하는 것이 어려운 이유를 제대로 파악하지 못했습니다.
Power Mock과 같은 다른 조롱 프레임워크는 가능하지만, 왜 Mockito는 불가능할까요?
나는 이 기사를 읽었지만, 저자는 그 단어에 대해 매우 반대하는 것 같다.static
아마 제가 잘 이해하지 못해서 그런 것 같아요.
알기 쉬운 설명/링크가 좋을 것 같습니다.
일반적으로 모의 객체 라이브러리는 실행 시(cglib 사용)에 동적으로 클래스를 생성하여 mock을 만들기 때문일 수 있습니다.즉, 실행시에 인터페이스를 실장하거나(내가 틀리지 않으면 EasyMock이 그렇게 한다), 또는 클래스로부터 모킹(Mockito가 틀리지 않으면 그렇게 한다)을 계승하는 것입니다.상속을 사용하여 정적 멤버를 재정의할 수 없기 때문에 두 방법 모두 정적 멤버에 대해 작동하지 않습니다.
통계학을 모의하는 유일한 방법은 실행 시 클래스의 바이트 코드를 수정하는 것입니다. 이것은 상속보다 조금 더 관련이 있다고 생각합니다.
그게 내 추측이야. 그게 무슨 가치가 있는지는 모르겠지만...
정적 방법을 시뮬레이션해야 하는 경우 설계가 잘못되었음을 나타내는 강력한 지표입니다.보통 시험 대상 클래스의 종속성을 조롱합니다.테스트 대상 클래스가 java.util과 같은 정적 메서드를 참조하는 경우.예를 들어, Math#sin - 테스트 대상 클래스에 정확하게 이 구현(예: 정확도 대 속도)이 필요하다는 것을 의미합니다.구체적인 사인파 실장으로부터 추상화하고 싶은 경우는, 인터페이스가 필요하게 될 가능성이 있습니다(이것의 방향을 알 수 있습니까?).
Mockito [ 3 . 4 . 0 ]는 정적 메서드를 조롱할 수 있습니다!
정적 메서드를 사용하는 클래스:
class Buddy { static String name() { return "John"; } }
새로운 방법을 사용하다
Mockito.mockStatic()
:@Test void lookMomICanMockStaticMethods() { assertThat(Buddy.name()).isEqualTo("John"); try (MockedStatic<Buddy> theMock = Mockito.mockStatic(Buddy.class)) { theMock.when(Buddy::name).thenReturn("Rafael"); assertThat(Buddy.name()).isEqualTo("Rafael"); } assertThat(Buddy.name()).isEqualTo("John"); }
Mockito는 다음 명령어 내의 스태틱메서드를 치환합니다.
try
블록만.
Mockito는 개체를 반환하지만 static은 "개체 수준이 아닌 클래스 수준"을 의미합니다.따라서 mockito는 null 포인터 예외를 static에 부여합니다.
Gerold Broser의 답변 외에 인수를 사용하여 정적 메서드를 조롱하는 예를 다음에 제시하겠습니다.
class Buddy {
static String addHello(String name) {
return "Hello " + name;
}
}
...
@Test
void testMockStaticMethods() {
assertThat(Buddy.addHello("John")).isEqualTo("Hello John");
try (MockedStatic<Buddy> theMock = Mockito.mockStatic(Buddy.class)) {
theMock.when(() -> Buddy.addHello("John")).thenReturn("Guten Tag John");
assertThat(Buddy.addHello("John")).isEqualTo("Guten Tag John");
}
assertThat(Buddy.addHello("John")).isEqualTo("Hello John");
}
정적인 방식도 조롱해야 한다면 코드 냄새라고 생각합니다.
- 일반적인 기능에 액세스하기 위한 정적 방법-> 싱글톤인스턴스를사용하여그인스턴스를삽입합니다.
- 서드파티제 코드?-> 자신의 인터페이스/대리점에 랩핑(필요한 경우 싱글톤으로도 사용)
내가 보기엔 구아바 같은 립이 과하게 느껴질 때가 딱 하나 있긴 하지만, 어쨌든 이런 종류의 립은 비웃을 필요가 없어. … (Iterables.transform(..) 등) »)
이렇게 하면 자신의 코드가 깔끔하게 유지되고, 모든 의존성을 깔끔하게 조롱할 수 있으며, 외부 의존성에 대한 손상 방지 계층이 구축됩니다.실제로 Power Mock을 본 적이 있는데, 필요한 모든 클래스가 제대로 설계되지 않았습니다.으로 인해 할 수 있습니다.
(예: https://code.google.com/p/powermock/issues/detail?id=355)
PS: 개인 방식도 마찬가지입니다.나는 시험이 사적인 방법의 세부사항을 알아야 한다고 생각하지 않는다.만약 수업이 너무 복잡해서 사적인 방법을 조롱하고 싶다면, 아마도 그 수업을 나누려는 신호일 것이다.
정적 메서드는 테스트하기 어려울 수 있으며, 특히 조롱할 필요가 있는 경우에는 테스트하기 어려울 수 있습니다.이 때문에 대부분의 조롱 프레임워크는 이러한 메서드를 지원하지 않습니다.저는 이 블로그 투고가 정적 메서드와 클래스를 어떻게 조롱할지를 결정하는 데 매우 유용하다는 것을 알았습니다.
언급URL : https://stackoverflow.com/questions/4482315/why-doesnt-mockito-mock-static-methods
'IT이야기' 카테고리의 다른 글
Vuex 어레이에서 특정 항목 제거 (0) | 2022.06.01 |
---|---|
휴지 상태 vs JPA vs JDO - 각각의 장단점 (0) | 2022.06.01 |
Vuejs 3 - data() 및 setup() 이외의 후크에서 템플릿으로 데이터를 전송하는 방법 (0) | 2022.06.01 |
범위 지정 슬롯에서 refs 요소를 가져오는 방법 (0) | 2022.06.01 |
vue js의 img의 :src에 동적으로 바인드하는 방법 (0) | 2022.06.01 |