Gidhub BE Developer

SpringBoot 테스트 : 슬라이스(Slice) 테스트 - Scpoe을 제한하다.

2020-07-08
goodGid

Prologue

  • SpringBoot에서 특정 Layer를 타켓으로 테스트가 가능하다.

  • 특정 Layer만 테스트하기 때문에

    @SpringBootTest 보다 효율적인 테스트가 가능하다.


슬라이스(Slice) 테스트

  • 슬라이스(Slice) 테스트를 한다는 건

    특정 Layer를 타켓으로 테스트를 한다는 뜻이다.

    ex) Controller Layer, Service Layer

  • 이 글에서는 Controller Layer를 타켓으로

    슬라이스(Slice) 테스트하는 방법에 대해 알아본다.


Controller를 테스트하다.

  • Controller 테스트는 Service Layer 테스트와 다르다.

  • Servce Layer 테스트는

    크게 3가지를 고려해서 진행하면 된다고 생각한다.

    Input / Output / Logic

  • 하지만 Controller는 좀 더 고려해야 할 변수가 많다.

  • Spring에서는 사용자의 요청이

    Controller에 도달하기까지 매우 많은 작업이 이뤄진다.

    (Interceptor, Filter, Converter 등)

  • 그러므로 Input / Output / Logic뿐만 아니라

    그 외에 작업들도 고려해야 한다.

  • 즉 이런 작업들까지 다 적용이 되어야지

    제대로 된 Controller 테스트라고 할 수 있다.

  • 만약 Controller의 순수 코드만 테스트하는 건

    Coverage를 채우기 위한 테스트이지

    테스트 본질과는 어긋나는 행위라고 생각한다.

  • 그러므로 Controller를 제대로 테스트하고자 한다면

    Interceptor, Filter, Converter 등

    실제로 사용자의 요청이 Controller까지 들어오는 환경과 동일해야하며

    그 환경을 제공하는 @WebMvcTest를 사용해야 한다.


@WebMvcTest

  • @WebMvcTest를 선언하면 Web과 관련된 Bean만 주입이 된다.

GoodGidControllerTest_WebMvc

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = GoodGidController.class) // [1]
public class GoodGidControllerTest_WebMvc {

    @MockBean
    GoodGidService mockGoodGidService;

    @Autowired
    MockMvc mockMvc;

    @Test
    public void goodGid() throws Exception {
        when(mockGoodGidService.getName()).thenReturn("mock goodGid");

        mockMvc.perform(get("/"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello goodGid"));
    }
}
  • [1] : @WebMvcTest에 타켓 Controller를 명시하였다.

    그리고 @WebMvcTest를 선언하였기 때문에 Web과 관련된 Bean만 등록된다.

  • 그러므로 사용하는 의존성이 있다면 Mocking을 해줘야 한다.

    ex) Service, Repository


Summary

  • 이 글을 한마디로 정리하자면 다음과 같다.

  • 만약 Controller를 테스트해야 한다면 @WebMvcTest를 사용하자.


Reference


Recommend

Index