본문 바로가기
프레임워크/스프링

[Spring] MockMvc

by so5663 2024. 3. 18.

MockMvc란?

MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.

 

WebAppConfiguration

@Mock
UserRepository userRepository;

@BeforeEach
void mockMvcSetUp(
        final WebApplicationContext context,
        final RestDocumentationContextProvider provider) {
    JwtAuthenticationProvider jwtAuthenticationProvider
            = new JwtAuthenticationProvider(AuthFixture.tokenProvider());

    // MockMvc를 설정합니다.
    this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
            .alwaysDo(print()) // 모든 요청과 응답을 콘솔에 출력합니다.
            .alwaysDo(restDocs) // Spring REST Docs 설정을 적용합니다.
            .alwaysDo(
                    document("{method-name}",
                            preprocessRequest(prettyPrint()),
                            preprocessResponse(prettyPrint()))
            )
            .addFilter(new CharacterEncodingFilter("UTF-8", true))
            .addFilter(new JwtAuthenticationFilter(jwtAuthenticationProvider))
            .apply(MockMvcRestDocumentation.documentationConfiguration(provider))
            .build();
}

 

addFilter()

addFilter()로 필터를 추가할 수 있다.

 

apply() 

MockMvc.apply() 메서드는 @Before 어노테이션으로 표시된 메서드 내에서 호출되며, 각각의 테스트 전에 필요한 구성을 수행합니다. 이를 통해 테스트 케이스마다 반복되는 설정 코드를 중복하지 않고 재사용할 수 있습니다.

MockMvc 실행

@Import(RestDocsConfig.class)
@ExtendWith(RestDocumentationExtension.class)
@DisplayName("deleteUser 메서드 실행 시")
@WebMvcTest
@Nested
class DeleteUserTest {

    @Autowired
    protected RestDocumentationResultHandler restDocs;
    
    @Test
    @DisplayName("성공")
    void DeleteUser() throws Exception {
        //given
        User user = UserFixture.user();
        FindUserDetailResponse findUserDetailResponse = FindUserDetailResponse.from(user);

        given(userService.findUser(any())).willReturn(findUserDetailResponse);

        //when
        ResultActions resultActions = mockMvc.perform(delete("/api/v1/users/me")
                .header("Authorization", accessToken));

        //then
        resultActions.andExpect(status().isOk())
                .andDo(restDocs.document(
                        requestHeaders(
                                headerWithName("Authorization").description("액세스 토큰")
                        )
                ));
    }
}

 

  • andDo() : print, log를 사용할 수 있는 메소드
  • perform에 Expect 메서드를 통해서 테스트를 진행할 수 있다.
  • andExpect() 로 기대값을 테스트 할수있다.