@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"))); } }
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(); }
SecurityMockMvcConfigurers.springSecurity()
요거 apply 안해주면 mvc 가 Sprint Security Filter를 포함하지 않아서 security에 대한 테스트 안됨FilterChainProxy
as a Filter
TestSecurityContextHolderPostProcessor
to support Running as a User in Spring MVC Test with Annotations. To do so, use Spring Security’s SecurityMockMvcConfigurers.springSecurity()
@SpringBootTest
에서 특정 Bean 제외하는 방법@EnableAutoConfiguration
의 exclude
프로퍼티 사용 (AutoConfiguration 제외)@SpringBootTest(classes = { TestConfig.class })
andExpect(jsonPath("$").doesNotExist())
"$.data[*].role"
) : data 안에 리스트의 모든 원소의 role 필드를 뽑아내서 JSONArray로 만들어줌MockMvcResultMatchers.jsonPath("$.data[*].role", Matchers.containsInAnyOrder(adminRole, adminRole, adminRole) )
resultActions.andExpectAll( jsonPath("$.data.accessToken", Matchers.not(token)) );
andExpect(MockMvcResultMatchers.
status
().reason("asdfasdf"))