MockBean

Bong2·2022년 4월 5일
0

@MockBean

  • spring-boot-test-starter 에서 제공되는 어노테이션
  • Bean 등록 과정에서 테스트에 필요한 Mocking 객체를 기존 객체 대신에 Bean으로 등록시켜 사용할 수 있게 만들어줌
  • Bean에 의존하는 모든 다른 객체들에 DI하여 손쉽게 Mocking 객체를 사용

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 등록을 위한 구성을 수행

Context reload

@MockBean을 수행하면 Spring Context reload가 수행된다.
100개의 테스트 클래스를 수행하면 10번의 reload가 일어난다면 테스트코드 수행이 10분이나 delay되는 현상이 발생될 수 도 있다. 하지만 이러한 것은 Bean에 의존하고 있는 모든 Bean들을 모두 교체해서 주입해주어야 하기 때문에 이미 등록된 Context상에서 처리하기에는 쉽지 않은 작업이다.

profile
자바 백엔드 개발자로 성장하자

0개의 댓글