3. 레스토랑 추가하기 레스토랑 생성 요청을 처리하기 위한 control 추가 Http 메소드 들 중에서 post
메소드를 사용해 새로운 레스토랑을 추가하는 요청을 처리할 것이고, /restaurnt
경로로 요청이 들어올 경우 request body 에 들어가 있는 데이터를 가져와 새로운 레스토랑을 생성한다.
@PostMapping("/restaurants") public ResponseEntity<?> create(@RequestBody Restaurant resource) throws URISyntaxException { String name = resource.getName(); String address = resource.getAddress(); Restaurant restaurant = Restaurant.builder() .name(name) .address(address) .build(); restaurantService.addRestaurant(restaurant); URI location = new URI ("/restaurants/" + restaurant.getId()); return ResponseEntity.created(location).body("{}" ); }
요청에 대한 레스토랑 생성 테스트 코드 작성 POJO를 JSON형태로 변환하기 위해 Jackson라이브러리의 ObjectMapper를 사용할 것이다. ObjectMapper를 통해 Restaurant객체를 JSON String 형태로 변환해 request body에 넣어 /restaurants
경로로 post요청을 한다.
@Autowired private ObjectMapper objectMapper;@Test public void 새로운_레스토랑_저장하기() throws Exception { String BobZip = "BobZip" ; String Seoul = "Seoul" ; Restaurant restaurant = Restaurant.builder() .categoryId(1L ) .name(BobZip) .address(Seoul) .build(); String content = objectMapper.writeValueAsString(restaurant); ResultActions resultActions = mockMvc.perform(post("/restaurants" ) .content(content) .contentType(MediaType.APPLICATION_JSON)); resultActions .andExpect(status().isCreated()) .andDo(print()); }
새로운 레스토랑을 생성하는 요청을 한 후 레스토랑의 정보를 가져오는 요청을 해 해당 정보가 제대로 생성 됐는지 확인한다.
@Test public void 새로운_레스토랑_저장_및_조회하기() throws Exception { String BobZip = "BobZip" ; String Seoul = "Seoul" ; Restaurant restaurant = Restaurant.builder() .categoryId(1L ) .name(BobZip) .address(Seoul) .build(); String content = objectMapper.writeValueAsString(restaurant); ResultActions postResultActions = mockMvc.perform(post("/restaurants" ) .content(content) .contentType(MediaType.APPLICATION_JSON)); postResultActions .andExpect(status().isCreated()) .andDo(print()); List<Restaurant> restaurants = new ArrayList <>(); restaurants.add(restaurant); given(restaurantService.getRestaurants()).willReturn(restaurants); ResultActions getResultActions = mockMvc.perform(get("/restaurants" )); getResultActions .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name" ).value(BobZip)) .andExpect(jsonPath("$[0].address" ).value(Seoul)) .andDo(print()); }
레스토랑 정보를 저장하는 Service 메소드 추가 @Service @RequiredArgsConstructor public class RestaurantService { private final RestaurantRepository restaurantRepository; public Restaurant addRestaurant (Restaurant restaurant) { restaurantRepository.save(restaurant); return restaurant; } public List<Restaurant> getRestaurants () { List<Restaurant> restaurants = restaurantRepository.findAll(); return restaurants; } public Restaurant getRestaurant (Long id) { Restaurant restaurant = restaurantRepository.findById(id) .orElseThrow(() -> new RestaurantNotFoundException (id)); return restaurant; } }
레스토랑을 추가하는 테스트 코드 추가 @Test public void 레스토랑_추가하기() { given(restaurantRepository.save(any())).will(invocation -> { Restaurant restaurant = invocation.getArgument(0 ); restaurant.setId(1234L ); return restaurant; }); Restaurant restaurant = Restaurant.builder() .name("BeRyong" ) .address("Busan" ) .build(); Restaurant created = restaurantService.addRestaurant(restaurant); assertThat(created.getId()).isEqualTo(1234L ); }