Spring

[Spring] @WebMvcTest MockMvc 테스트

snail voyager 2023. 8. 27. 22:31
728x90
반응형

WebMvcTest

  • 웹 애플리케이션의 컨트롤러(Controller) 관련 테스트를 위해 사용
  • 실제 웹 서버를 띄우지 않고도, Spring MVC 컨트롤러의 동작을 테스트
  • Spring 컨텍스트를 로드하고 의존성 주입(DI)을 사용하는 테스트 클래스에서
  • @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, WebMvcConfigurer, HandlerMethodArgumentResolver 등 MVC 테스트에 필요한 설정만 로드
  •  @Component, @Service, @Repository 등 불필요한 컴포넌트 로드 X
  •  테스트에 필요한 컴포넌트는 @MockBean or @Import 활용해 사용
  • 전체 애플리케이션의 설정이 필요한 테스트는 @SpringBootTest, @AutoConfigureMockMvc 사용
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@WebMvcTest(HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testSayHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
               .andExpect(MockMvcResultMatchers.status().isOk())
               .andExpect(MockMvcResultMatchers.content().string("Hello, World!"));
    }
}

MockMvc

  • 웹 계층을 테스트하기 위한 도구로, 가짜로 HTTP 요청을 만들고 컨트롤러의 동작과 응답을 검증하는 데 사용
  • 실제 웹 서버를 띄우지 않고도 웹 계층을 테스트할 수 있도록 해주는 도구
  • HTTP 요청을 만들고 보내기: MockMvc 객체를 사용하여 GET, POST, PUT, DELETE 등의 HTTP 요청을 생성, 전송
  • 컨트롤러의 동작 검증: MockMvc 객체를 사용하여 컨트롤러의 메서드가 올바르게 동작하는지 검증
  • 응답 검증: MockMvc 객체를 사용하여 컨트롤러의 응답이 기대한 대로 반환되는지 검증

MockMvcResultMatchers

  • MockMvc를 사용하여 웹 계층 테스트 시 응답 결과를 검증하기 위한 다양한 유용한 메서드들이 포함
  1. status(): 응답의 상태 코드를 검증하는 메서드입니다. isOk(), isNotFound(), isServerError() 등의 여러 상태 코드를 검증할 수 있습니다.
  2. content(): 응답 본문의 내용을 검증하는 메서드입니다. .string(expectedContent)을 사용하여 본문의 내용을 검증할 수 있습니다.
  3. jsonPath(): JSON 응답에서 특정 필드의 값을 검증할 때 사용합니다. $.field.path와 같은 형식으로 필드 경로를 지정하고 그 값을 검증할 수 있습니다.
  4. view(): 응답의 뷰 이름을 검증하는 메서드입니다. .name(expectedViewName)을 사용하여 뷰의 이름을 검증할 수 있습니다.
  5. forwardedUrl(): 응답이 Forward될 경우, 실제 Forward된 URL을 검증합니다.
  6. model(): 컨트롤러에서 모델에 추가된 속성을 검증합니다. .attributeExists("attributeName")와 같이 속성의 존재 여부를 검증할 수 있습니다.
  7. flash(): Flash 속성에 대한 검증을 수행합니다. .attributeExists("attributeName")를 사용하여 Flash 속성의 존재 여부를 검증할 수 있습니다.
  8. redirectedUrl(): 응답이 Redirect될 경우, 실제 Redirect된 URL을 검증합니다.
  9. cookie(): 응답에 포함된 쿠키를 검증합니다. .value("cookieName", "expectedValue")와 같이 쿠키의 이름과 값을 검증할 수 있습니다.

@ExtendWith(SpringExtension.class)

  • @ExtendWith는 JUnit 5에서 사용되는 애노테이션으로, 테스트 확장을 지정할 때 사용
  • JUnit 4의 @RunWith와 비슷한 역할을 수행하지만, 더 유연하고 확장 가능한 방식으로 테스트 환경을 커스터마이징
  • @ExtendWith(SpringExtension.class)을 사용하면 Spring Boot의 테스트 환경을 확장하여 Spring 컨텍스트를 사용 가능
  • Spring 컨텍스트를 로드하고 의존성 주입(DI)을 사용하는 테스트 클래스에서 사용
@ExtendWith(SpringExtension.class) // Spring 컨텍스트 확장 사용
@WebMvcTest
public class MyIntegrationTest {

    @Autowired
    private MyService myService;

    @Test
    public void testSomething() {
        // myService를 사용한 테스트 작성
    }
}

 

 

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTest.html

728x90
반응형