class UserControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private UserServiceImpl userService;
Spring에서 테스트코드 작성을 손쉽게 해주는 매우 유용한 기능이다.
우선 테스트 코드가 수행될때는 TestExecutionListener에 의해 이벤트를 감지하고 처리한다.
// org.springframework.test.context.TestExecutionListener.java
public interface TestExecutionListener {
default void beforeTestClass(TestContext testContext) throws Exception {
}
default void prepareTestInstance(TestContext testContext) throws Exception {
}
default void beforeTestMethod(TestContext testContext) throws Exception {
}
default void beforeTestExecution(TestContext testContext) throws Exception {
}
default void afterTestExecution(TestContext testContext) throws Exception {
}
default void afterTestMethod(TestContext testContext) throws Exception {
}
default void afterTestClass(TestContext testContext) throws Exception {
}
}
@MockBean을 처리할때는 위 TestExecutionListener를 구현한 MockitoTestExecutionListener를 통해 처리된다.
public class MockitoTestExecutionListener extends AbstractTestExecutionListener {
prepareTestInstance 테스트 준비단계에서 injectFields 메서드를 통해 @MockBean 필드를 찾아 Mocking Bean 등록을 위한 구성을 수행
@MockBean을 수행하면 Spring Context reload가 수행된다.
100개의 테스트 클래스를 수행하면 10번의 reload가 일어난다면 테스트코드 수행이 10분이나 delay되는 현상이 발생될 수 도 있다. 하지만 이러한 것은 Bean에 의존하고 있는 모든 Bean들을 모두 교체해서 주입해주어야 하기 때문에 이미 등록된 Context상에서 처리하기에는 쉽지 않은 작업이다.