유닛 테스트를 할 때 컨트롤러 단만 테스트 해야하는 경우가 있습니다. 이럴 때에는 스프링 부트에서 제공해주는 @WebMvcTest()
와 MockMvc
를 사용하면 됩니다.
@WebMvcTest([ControllerName.class])
MockMvc
@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
을 통해서 검증을 합니다.
만약 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
로 설정하게 되면 위의 방법과 동일하게 전달된 키값들만 비교하게 됩니다.