스프링부트 테스트(SpringBoot Test) - @WebMvcTest

스프링부트는 Spring MVC의 컨트롤러 테스트를 위해 @WebMvcTest 어노테이션을 제공한다. WebMvcTest는 MockMvc를 구성하기 때문에 모의 MVC 형태로 HTTP 서버를 구성할 필요 없이 신속한 테스트를 가능케 한다.

@SpringBootTest는 실제 어플리케이션과 동일하게 어플리케이션 컨텍스트를 로드하여 동작하므로 Bean의 개수가 늘어나면 주입 속도가 느려져 테스트 자체의 의미가 희석될 수 있다. 하지만 @WebMvcTest의 경우 MVC와 관련된 @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, WebMvcConfigurer 그리고 HandlerMethodArgumentResolver만 로드하기때문에 더 가벼운 테스트를 지원한다.(@Component 빈은 주입되지 않는다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RunWith(SpringRunner.class)
@WebMvcTest(BbsController.class)
public class BbsControllerTest {

@Autowired
private MockMvc mvc;

// 가짜 Bean에 등록
@MockBean
private BbsService bbsService;

@Test
public void selectReadTest() throws Exception {
User user = new User(1, "leejh");
Bbs item = new Bbs("test bbs", user);
given(bbsService.readByBbs(1)).willReturn(item); // return 정의
mvc.perform(get("/bbs/read").param("id", "1")) // getMethods
.andExpect(status().isOk()) // HTTP STATUS 200 (sucess)
.andExpect(view().name("usr.read")) // view name check
.andExpect(model().attributeExists("bbs")) // property check
.andExpect(model().attribute("bbs", Matchers.contains(item)));
}
}

@WebMvcTest 어노테이션에 테스트 대상 컨트롤러를 명시하므로써 모든 컨텍스트를 로드하는 @SpringBootTest에 비해 가벼운 테스트가 가능하다.

스프링부트 레퍼런스에 의하면 @WebMvcTest만으로 테스트를 진행하는 것이 충분치 않을 경우가 있으므로 실제 서버와 완벽한 엔드-투-엔드 테스트를 위해선 @SpringBootTest를 사용하라고 말한다.


ResultActions

  • andDo() : 요청 처리를 수행한다.
    ex) mvc.perform(get(“/form”)).andDo(print());
  • andExpect() : 예상 값을 검증한다
    ex) mvc.perform(get(“/form”)).andExpect(matchAll(status().isOk(),redirectedUrl(“/person/1”)));
  • andReturn() : 요청 결과를 반환(?)

ResultActionsMockMvcResultMatchers

Share