공부한것들을 정리하는 블로그 입니다.
3. 상세 조회(Repository, RepositoryImpl 추가) 본문
반응형
1. 단위테스트 RestaurantControllerTest 에 가게 상세조회 추가
- detail() 추가
package kr.com.cyh.RRS.interfaces;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import sun.tools.jconsole.JConsole;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@WebMvcTest(RestaurantController.class)
public class RestaurantControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void test() throws Exception {
mvc.perform(get("/restaurants"))
.andExpect(status().isOk())
.andExpect(content().json( //json array
"[{\"address\":\"Seoul\",\"name\":\"Bob zip\",\"id\":1004,\"information\":\"Bob zip in Seoul\"}]"
));
// .andExpect(content().json(
// //json object
// "{'data':[{'useRegEx':'false','hosts':'v2v2v2'}]}"
// ));
}
@Test
public void list() throws Exception {
mvc.perform(get("/restaurants"))
.andExpect(status().isOk())
.andExpect(content().string(
containsString("\"id\":1004")
))
.andExpect(content().string(
containsString("\"name\":\"Bob zip\"")
));
}
//가게 상세
@Test
public void detail() throws Exception {
mvc.perform(get("/restaurants/1004"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("\"id\":1004")))
.andExpect(content().string(containsString("\"name\":\"Bob zip\"")));
mvc.perform(get("/restaurants/2020"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("\"id\":2020")))
.andExpect(content().string(containsString("\"name\":\"Cyber Food\"")));
}
}
2. 테스트가 성공하도록 RestaurantController 소스코드 수정
- detail() 추가
package kr.com.cyh.RRS.interfaces;
import kr.com.cyh.RRS.domain.Restaurant;
import kr.com.cyh.RRS.domain.RestaurantRepository;
import kr.com.cyh.RRS.domain.RestaurantRepositoryImpl;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class RestaurantController {
private RestaurantRepository restaurantRepository = new RestaurantRepositoryImpl();
@GetMapping("/restaurants")
public List<Restaurant> list() {
List<Restaurant> restaurants = restaurantRepository.findAll();
return restaurants;
}
@GetMapping("/restaurants/{id}")
public Restaurant detail(@PathVariable("id") Long id) {
Restaurant restaurant = restaurantRepository.findById(id);
return restaurant;
}
}
3. RestaurantRepositoryImpl 추가
- RestaurantController가 Controller의 역할만 수행 할 수 있도록 계층을 분리해줌(RestaurantRepositoryImpl 생성)
package kr.com.cyh.RRS.domain;
import java.util.ArrayList;
import java.util.List;
public class RestaurantRepositoryImpl implements RestaurantRepository {
private List<Restaurant> restaurants = new ArrayList<>();
public RestaurantRepositoryImpl(){
restaurants.add( new Restaurant(2020L, "Cyber Food", "Seoul"));
restaurants.add(new Restaurant(1004L, "Bob zip", "Seoul"));
}
@Override
public List<Restaurant> findAll() {
return restaurants;
}
@Override
public Restaurant findById(Long id) {
return restaurants.stream().filter(r -> r.getId().equals(id)).findFirst().orElse(null);
}
}
4. RestaurantRepository 추가
- RestaurantController에서 list()와 detail()에서 모두 RestaurantRepositoryImpl 을 호출하므로, 상호계층 간의 규약을 위해 인터페이스 RestaurantRepository 생성(RestaurantRepositoryImpl 는 RestaurantRepository 을 상속받음)
package kr.com.cyh.RRS.domain;
import java.util.ArrayList;
import java.util.List;
public interface RestaurantRepository {
List<Restaurant> findAll();
Restaurant findById(Long id);
}
5. 테스트 실행 및 결과확인
** 참고
- 사용 편의를 위해 Restaurant 클래스의 생성자의 argument 순서 리펙터링했음. 따라서 Restaurant 의 생성자를 사용하고있는 RestaurantTests 에서 error가 발생함. 별거없고 그냥 에러나는 부위도 리펙터링 해주면 됨.
반응형
'(2020) 사이드 프로젝트 > RRS(게시판-SpringBoot)' 카테고리의 다른 글
2. 가게목록 조회(REST API 및 단위테스트 실습) (0) | 2020.01.09 |
---|---|
1. 프로젝트 생성 (0) | 2020.01.09 |
0. RRS(Restaurant-Reservation-System) 설정 (0) | 2020.01.09 |
Comments