진행중인 프로젝트에서 Controller의 요청을 받고 응답을 하는 메서드의 테스트 코드를 작성해 보았다.
@AutoConfigureMockMvc
@SpringBootTest
class RestaurantControllerV1Test {
@Autowired
private MockMvc mockMvc;
@Autowired
RestaurantService restaurantService;
@Autowired
RestaurantRepository restaurantRepository;
@BeforeEach
void clear() {
restaurantRepository.deleteAll();
}
@Test
@DisplayName("POST /api/v1/restaurants 요청 시 식당 기본 정보가 DB에 저장된다.")
void saveRestaurant() throws Exception {
//given
RestaurantSaveRequestDto clientRequest = new RestaurantSaveRequestDto("쉐이크쉑 청담점", 5000, 2000);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(clientRequest);
//when
mockMvc.perform(post("/api/v1/restaurants")
.contentType(APPLICATION_JSON)
// .content("{\"name\":\"쉐이크쉑 청담점\", \"minOrderPrice\":\"5000\", \"deliveryFee\":\"2000\"}")
.content(json)
)
.andExpect(status().isOk())
.andDo(print());
// then
assertEquals(1L, restaurantRepository.count());
Restaurant restaurant = restaurantRepository.findAll().get(0);
assertEquals("쉐이크쉑 청담점", restaurant.getName());
assertEquals(5000, restaurant.getMinOrderPrice());
assertEquals(2000, restaurant.getDeliveryFee());
}
}
하나의 Controller Method에 대한 테스트이다. 해당 메서드는 음식점에 대한 '이름', '최소주문금액', '배달비' 의 기본 정보를 통해서 음식점을 등록하고 성공 시 요청한 데이터와 저장된 음식점의 primary_id까지 함께 응답하는 기능을 갖는다.
SpringBootTest를 통해 Test를 진행하게 되는데 만일 이전에 @SpringBootTest 어노테이션을 사용할 경우에 MockMvc의 의존성 주입이 이뤄지지 않을 수 있기 때문에 @AutoConfigureMockMvc 어노테이션을 사용한다.
테스트의 내용은 클라이언트에서 전달하는 데이터를 ObjectMapper를 통하여 JSON으로 만들고 MockMvc를 통해서 요청을 하고 DB에 데이터가 한 개만 들어있는지 그리고 해당 데이터를 가져와 요청 시에 보낸 데이터와 같은지 확인하는 것이다.
'content'를 주석에서 보는 것과 같이 단순 문자열로 처리하여 보낼 수도 있지만 ObjectMapper를 이용하면 더욱 편하고 가독성이 좋게 테스트를 진행시킬 수 있다.
아쉬운 점