관리 메뉴

공부한것들을 정리하는 블로그 입니다.

3. 상세 조회(Repository, RepositoryImpl 추가) 본문

(2020) 사이드 프로젝트/RRS(게시판-SpringBoot)

3. 상세 조회(Repository, RepositoryImpl 추가)

호 두 2020. 1. 9. 20:02
반응형

 

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 생성(RestaurantRepositoryImplRestaurantRepository 을 상속받음)

 

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가 발생함. 별거없고 그냥 에러나는 부위도 리펙터링 해주면 됨.

 

 

https://github.com/cyh789/Restaurant-Reservation-System/tree/9b09cf8e61397b7f4603e63315211cce7d96af7c

 

cyh789/Restaurant-Reservation-System

레스토랑 예약 사이트 만들기 - IntelliJ, SpringBoot, JPA 등등. Contribute to cyh789/Restaurant-Reservation-System development by creating an account on GitHub.

github.com

 

반응형
Comments