6.1 정적 메서드 mockStatic() 조롱
그리고 한 가지 더 중요한 점은 정적 메서드의 조롱 및 검증입니다. "그게 뭐가 문제야?" 당신이 묻는다. 예, 정적이지만 메서드는 동일합니다. 그리고 당신은 틀릴 것입니다.
목 객체에 대해 배우기 시작한 곳을 기억하십니까? 이러한 객체는 DynamicProxy
. 그리고 정적 메서드는 어떤 개체에도 바인딩되지 DynamicProxy
않으며 . 그게 다야.
그러나 Mockito의 제작자도 여기에서 피할 수 있었습니다. 그들은 자체 클래스 로더를 작성했고 그 도움으로 즉석에서 클래스를 교체할 수 있었습니다. 크고 어려운 일이지만 그들은 여전히 해냈습니다.
다음에 추가 라이브러리를 추가해야 합니다 pom.xml
.
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
정적 메서드를 조롱해야 하는 경우 작동하는 방법은 다음과 같습니다.
1 특별한 모의 클래스 객체를 만듭니다.
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 이 개체에 작업 규칙을 추가합니다.
규칙의 이 목적에 대해 다른 방식으로 집착할 필요가 있습니다.
managerObject.when(ClassName::method name).thenReturn(result);
3 개체가 즉시 삭제되고 Mockito가 관련 규칙을 지울 수 있도록 이 개체의 사용을 래핑해야try-with-resources
합니다 .
예:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
@Mock
주석 및 처럼 아름답지는 않지만 @Spy
매우 실용적입니다. 테스트 중인 메서드 내부에서 사용되는 간단한 정적 메서드를 조롱하는 것이 불가능할 때 테스트를 작성하는 것은 매우 어려웠습니다.
GO TO FULL VERSION