[JUnit & Mockito] Using @MockMvc to test Controllers

원알렉스·2020년 8월 28일
0

JUnit & Mockito

목록 보기
6/9
post-thumbnail

🚀 Testing Controllers

유닛 테스트를 할 때 컨트롤러 단만 테스트 해야하는 경우가 있습니다. 이럴 때에는 스프링 부트에서 제공해주는 @WebMvcTest()MockMvc 를 사용하면 됩니다.

  • @WebMvcTest([ControllerName.class])
    • 이 어노테이션을 클래스 상단부에 붙여주면 MVC 관련 이외의 설정들을 비활성화 시켜줌으로써 MVC 테스트를 실행시킬 수 있도록 해줍니다.
  • MockMvc
    • 스프링 MVC 테스트시 서버 사이드 엔트리 객체입니다.
@WebMvcTest(HelloWorldController.class)
class HelloWorldControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void helloWorld_basic() throws Exception{
        // create request
        RequestBuilder request = MockMvcRequestBuilders
                .get("/hello-world")
                .accept(MediaType.APPLICATION_JSON);

        // call "/hello-world"
        MvcResult result = mockMvc
                .perform(request)
                .andExpect(status().isOk())
                .andExpect(content().string("Hello World"))
                .andReturn();

        // verify
        // assertEquals("Hello World", result.getResponse().getContentAsString());
    }
}

먼저 RequestBuilder 로 Request를 생성해주고 MockMvc 를 통해서 REST API 테스트를 진행합니다. 이 과정에서 만약 응답이 비교적 간단하면 andExpect(ResultMatchers) 를 통해서 검증을 해주고, 비교적 복잡하다면 Assertion을 통해서 검증을 합니다.

✓ JSON Assertions

만약 Response 의 JSON 객체의 내용을 검증할 경우에는 json() 함수를 사용하시면 됩니다.

MvcResult result = mockMvc
                .perform(request)
                .andExpect(status().isOk())
                .andExpect(content().json("{\"id\":1,\"name\":\"Mac Book Pro\",\"price\":10,\"quantity\":100}"))
                .andReturn();

그러나 이 방법을 사용하게 된다면 전달된 키값들만 비교하게 되서 그 외의 값들은 같은지 비교를 하지 않습니다. 그래서 예상하는 JSON 객체의 키값들과 실제 반환되는 JSON 객체의 모든 키값들이 같은지 비교하기 위해서는 JSONAssert 라이브러리를 사용하면 됩니다.

MvcResult result = mockMvc
                .perform(request)
                .andExpect(status().isOk())
                .andReturn();

String actualResponse = "{\"id\":1,\"name\":\"Mac Book Pro\",\"price\":10,\"quantity\":100}";
// JSONAssert.assertEquals(expected, actual, strict);
JSONAssert.assertEquals(result.getResponse().getContentAsString(), actualResponse, true);

이때 마지막 strict 파라미터를 true 로 설정해줘야 합니다. false 로 설정하게 되면 위의 방법과 동일하게 전달된 키값들만 비교하게 됩니다.

profile
Alex's Develog 🤔

0개의 댓글