본문 바로가기
SpringBoot/테스트코드

[JUnit]MVC 테스트 어노테이션 알아보기

by devebucks 2020. 7. 5.
728x90

@SpringBootTest 설명

  • springboot에서 제공하는 어노테이션입니다.
  • SpringApplication의 테스트를 할 때 사용합니다.

@SpringBootTest Option

1. MOCK(Default)

  • @AutoConfigureMockMvc나 @AutoConfigureWebTestClient와 함께 사용할 수 있다고 합니다.
  • mock web 환경이 제공되며, springboot 내장 톰켓 서버를 실행하지 않고 테스트를 할 수 있게됩니다.

2. RANDOM_PORT

  • WebServerApplicationContext를 다운받아 실제 웹 환경을 제공하는 옵션입니다.
  • 내장 톰켓 서버가 8080이 아닌 랜덤포트로 시작됩니다.

3. DEFINED_PORT

  • WebServerApplicationContext를 다운받아 실제 웹 환경을 제공하는 옵션입니다.
  • application.properties에서 개발자가 포트를 지정해서 내장 톰켓 서버를 실행합니다.

4. 아무것도 옵션을 주지 않는 경우(NONE)

  • 웹과 관련된 테스트를 할 수 없다.

 

 

 

Auto-configured Spring MVC Tests를 위한 어노테이션

 가령, Spring의 MVC Controller가 예상되는 페이지로 응답을 보내오고, 예상되는 값이 응답 페이지에 노출되는지 테스트를 하려고합니다. 테스트 클래스에 @SpringBootTest를 사용한다면, springboot 프로젝트와 연관된 모든 bean을 등록하고 테스트하기 때문에 테스트하는데 시간이 많이 걸리게 됩니다.

feat. 공식 문서

 이때, Spring Mvc 테스트(web layer)만을 위한 bean만 주입받아서 테스트한다면, 테스트 시간이 빨라질 것입니다. Spring Mvc 슬라이싱 테스트에 사용하는 자동설정 어노테이션에는 두 가지가 있습니다.

 

@AutoConfigureMockMvc 

@WebMvcTest

 

feat. 공식 문서

 

1. @AutoConfigureMockMvc

다중

 

Mock은 Springboot의 내장 servlet container를 실행하지 않고, 단지 모의적인 serlvet 환경을 제공해 줍니다.

feat. 공식 문서

2. @WebMvcTest

feat. 공식 문서

  •  @WebMvcTest는 Spring MVC controllers가 예상대로 동작하는지 테스트할 때 사용합니다. 
  • @WebMvcTest는 테스트를 위해서 Spring 프로젝트 bean을 전부 스캔하지 않고, 특정 어노테이션을 가진 Beans만 스캔한다는 것이 가장 큰 특징입니다.
  • @WebMvcTest가 스캔하는 bean은 다음 어노테이션이 지정된 클래스들입니다.
@Controller, @ControllerAdvice, @JsonComponent, 
Converter, GenericConverter, Filter, WebMvcConfigurer 그리고 HandlerMethodArgumentResolver

 

  • @Component beans은 @WebMvcTest에서는 테스트를 지원하지 않습니다.
  • @WebMvcTest는 단일 컨트롤러를 대상으로 테스트가 가능하고, MockBean과 함께 사용되는 것으로 나와있습니다.
  • Mock을 사용하면, full HTTP server를 실행할 필요없이 MVC controller테스트를 빠르게 테스트할 수 있다고 합니다.

 

사용법.

1. @WebMvcTest에서 테스트할 "controller의 파일이름.class"로 지정해 줍니다.(클래스 1개만 지정 가능)

2. @Autowired로 MockMvc를 주입받고, MockMvc클래스의 메소드들을 사용해서 테스트합니다.

 

 

Web MVC 테스트를 할 때, 응답페이지에 포함된 내용이 예상되는 값이 있는지 테스트하는 방법은 다음과 같습니다.

 

import org.junit.*;
import org.junit.runner.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

@RunWith(SpringRunner.class)
@WebMvcTest(ExController.class)
public class HtmlUnitTest(){
     @Autowired
     MockMvc mockMvc;

     @Test
     public void testExample() throws Exception{
          HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
          assertThat(page.getBody().getTextContent()).isEqualTo("Hello boot");
     }
}
728x90

댓글