ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TDD] @WebMvcTest vs MockMvcBuilders.standaloneSetup
    TDD 2024. 8. 31. 21:17

     

     

    보라색은 개발자가 직접 작성해야하는 것들

    파란색은 TestCase를 작성한 방식과 부여한 어노테이션에 따라 Spring이 알아서 제공해준다

     


    1. TestCase 내에서 MockMvc를 생성한다. 이 MockMvc는 테스트할 컨트롤러와 상호작용하는데 필요함

    2. MockMvc가 TestDispatcherServlet에게 원하는 URL로 요청을 보낸다.

    이때 MockMvc의 MockMvcRequestBuilders 함수를 사용해서

    특정 요청에 필요한 HttpMethod를 지정, requestparameter 지정, 헤더, 쿠키등을 설정할 수 있다

     

    3. TestDispatcherServlet이 프로젝트 내에서 개발자가 구현한 그리고 해당 테스트에서 테스트하겠다고 명시한 Controller로 2번에서 생성한 request를 보낸다

    4. 이에 대한 response를 받으면 andExpect로 response 값이 맞는지 검증해주면 된다

    Mockito의 andExpect는 Assertions의 assertThat과 똑같은 기능이다!

     


    [@WebMvcTest]

     

    @WebMvcTest는 Spring Boot 어노테이션으로

    해당 컨트롤러 클래스와 관련된 Spring Context를 부분적으로 로드함

    하지만 이렇게 부분적인 컨텍스트만 로드한다고 쳐도

    스프링 컨텍스트 활용을 하긴 하니 테스트 속도가 Mockito 활용할때보다 느

     

    그래서 아래와 같이 @Autowired를 사용해서 의존성 주입을 할 수 있음

    그리고 Mock 객체를 주입해야하는 곳이 스프링 컨텍스트 로드로 인해 사용하는 Bean 객체니까

    @MockBean 을 통해 Mock 빈 객체를 주입해줘야한다

     

    @WebMvcTest(MemberController.class)
    class MemberControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
        
        @MockBean
        private MemberService memberService;
    
    }

     


    [MockMvcBuilders.standaloneSetUp]

     

    standAloneSetup은 Spring Context를 로드하지는 않음 > 그래서 더 빠르다

    하지만 Spring Context를 로드하지 않으므로 내가 의존성 주입을 수동으로 해줘야한다

    그게 MockMvcBuilders.standaloneSetUp().build 코드이다.

     

    @ExtendWith(MockitoExtension.class)
    class CodeControllerTest {
    
        @InjectMocks
        private CodeController codeController;
    
        @Mock
        private CodeService codeService;
    
        private MockMvc mockMvc;
    
        @BeforeEach
        void setUp() {
            mockMvc = MockMvcBuilders.standaloneSetup(codeController).build();
        }
        
        // test code
    }

     

    내가 수동으로 지정해줘야하기 때문에

    Controller를 Mock 객체들을 주입받을 @InjectMocks로 선언해주고

    해당 Controller가 동작하기 위해 필요한 Service

    즉, 의존성 주입해야할 @Mock 객체를 명시한 것이다

    'TDD' 카테고리의 다른 글

    [TDD] @Spy  (0) 2024.09.01
    [TDD] @Mock vs @MockBean  (0) 2024.08.31
    [TDD] Mockito annotations.zip  (0) 2024.08.31
    [TDD] Spring Boot 테스트 종류  (1) 2024.08.31
    [TDD] H2Database  (1) 2024.02.13