HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
@AutoconfigureMockMvc @SpringBootTest : 애플리케이션을 실행하지 않고, Spring이 HTTP request를 handle 하고 controller에 넘겨주는 것 까지만 테스트 하는 방법
MockMvc 가 주입되기 위해서는 @SpringBootTest에서는 @AutoConfigureMockMvc 가 사용되어야 함 && WebEnvironMent None이 되면 해당 MockMvc 못찾음
package com.example.testingweb; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; @SpringBootTest @AutoConfigureMockMvc public class TestingWebApplicationTest { @Autowired private MockMvc mockMvc; @Test public void shouldReturnDefaultMessage() throws Exception { this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk()) .andExpect(content().string(containsString("Hello, World"))); } }
해당 테스트에서, 스프링의 모든 애플리케이션 컨텍스트가 서버 없이 실행되는 것임
  • WebEnvironment (참고 : 스프링 부트 테스트)
    • RANDOM_PORT
    • MOCK : 내장 톰캣 구동 안함
    • DEFINED_PORT
    • NONE
MockMvcBuilders 를 이용하여 MockMvc 커스텀 정의하는 방법
@ExtendWith(RestDocumentationExtension.class) @SpringBootTest @Import(RestDocsConfig.class) @ActiveProfiles("test") public abstract class AbstractControllerTest { @Autowired protected RestDocumentationResultHandler restDocs; protected MockMvc mvc; @BeforeEach public void setup(RestDocumentationContextProvider provider, WebApplicationContext context) { this.mvc = MockMvcBuilders.webAppContextSetup(context) .apply(MockMvcRestDocumentation.documentationConfiguration(provider)) .apply(SecurityMockMvcConfigurers.springSecurity()) .alwaysDo(restDocs) .addFilter(new CharacterEncodingFilter("UTF-8", true)) .build(); }
[ Spring Security Docs ] Setting up MockMvc and Spring Security
  • SecurityMockMvcConfigurers.springSecurity() 요거 apply 안해주면 mvc 가 Sprint Security Filter를 포함하지 않아서 security에 대한 테스트 안됨
  • To use Spring Security with Spring MVC Test, add the Spring Security FilterChainProxy as a Filter
  • You also need to add Spring Security’s TestSecurityContextHolderPostProcessor  to support Running as a User in Spring MVC Test with Annotations. To do so, use Spring Security’s SecurityMockMvcConfigurers.springSecurity()
  • @SpringBootTest 에서 특정 Bean 제외하는 방법
    • [ Baeldung ] Exclude Auto-Configuration classes in Spring Boot Tests
      1. @EnableAutoConfiguration 의 exclude 프로퍼티 사용 (AutoConfiguration 제외)
      1. 해당 Bean을 TestConfig로 null로 등록하면, 해당 Bean이 대체됨
        1. @SpringBootTest(classes = { TestConfig.class })

JsonPath

사용법 참고 : Jayway JsonPath Github
  • mockMvc를 이용하여 반환된 json이 null인지 확인하는 방법
    • andExpect(jsonPath("$").doesNotExist())
  • array 의 특정 필드를 뽑아내는 방법
    • jsonPath("$.data[*].role") : data 안에 리스트의 모든 원소의 role 필드를 뽑아내서 JSONArray로 만들어줌
    • 그후 해당 array를 비교하는 방법
      • MockMvcResultMatchers.jsonPath("$.data[*].role", Matchers.containsInAnyOrder(adminRole, adminRole, adminRole) )
    • root Array의 각 아이템별 모든 프로퍼티를 뽑아내는건 아무리 해도 잘 안됐음. objectMapper 통해서 deserializing 해서 비교
      • 봤었던 Github issue. How to traverse array which is the root element
  • 값이 다르다는 것을 비교할 때
    • resultActions.andExpectAll( jsonPath("$.data.accessToken", Matchers.not(token)) );
    • 이 때 Matchers는 org.hamcrest 것.

꿀팁

  • 에러 메시지 확인을 위해서는 아래와 같이 이용
    • andExpect(MockMvcResultMatchers.status().reason("asdfasdf"))