본문 바로가기

카테고리 없음

Junit5 Mockito 를 쓸 때 짤막한 팁

반응형

 Junit5 기준으로 Mockito 와 @BeforeEach, @BeforeAll 등의 CallBack Annotation을 사용할 일이 있다면, 

@ExtendWith(MockitoExtension.class) 를 테스트 클래스에 선언해 주도록 하자!

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

 

MocktioExtension.class 코드를 까보면, AfterEach, BeforeEach 등 @BeforeEach 등과 같은 콜백 어노테이션에서 인터페이스로 정의된 메소드를 implement 해주는 역할을 한다. 가끔, 테스트 빌드 환경에서, @ExtendWith(MockitoExtension.class)  를 클래스에 선언하지 않고 사용하면, @BeforeEach 콜백 어노테이션의 구현 Class를 로드하지 못해서 계속 실행시도하면서 loop 만 돌다가, Memory Leak 에러가 뜨더라.. 

 

아래는 MocktioExtension.class 의 코드 일부인데,  ~~EachCallback 함수를 구현해주는 것을 볼 수 있다.. 

```public class MockitoExtension implements TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, ParameterResolver {
private static final Namespace MOCKITO = Namespace.create(new Object[]{"org.mockito"});
private static final String SESSION = "session";
private static final String TEST_INSTANCE = "testInstance";
private final Strictness strictness;

public MockitoExtension() {
this(Strictness.STRICT_STUBS);
}

private MockitoExtension(Strictness strictness) {
this.strictness = strictness;
}

public void postProcessTestInstance(Object testInstance, ExtensionContext context) {
context.getStore(MOCKITO).put("testInstance", testInstance);
}

public void beforeEach(ExtensionContext context) {
Set<Object> testInstances = new LinkedHashSet();
testInstances.add(context.getRequiredTestInstance());
this.collectParentTestInstances(context, testInstances);
Strictness actualStrictness = (Strictness)this.retrieveAnnotationFromTestClasses(context).map(MockitoSettings::strictness).orElse(this.strictness);
MockitoSession session = Mockito.mockitoSession().initMocks(testInstances.toArray()).strictness(actualStrictness).startMocking();
context.getStore(MOCKITO).put("session", session);
}```

 

 

반응형