이전에 서비스 테스트할때는 얘를 모키토 영역에 띄웠기 때문에 상관없었는데
컨트롤러 테스트할 때는 @WebMvcTest가 진짜 컨트롤러를 띄웠기 때문에 IoC 컨테이너에 뜨게된다.
컨트롤러가 의존하고있는 것이 서비스인데, 그러면 스프링이 IoC 컨테이너에서 서비스를 찾게된다.
그래서 모크 서비스를 IoC에 등록해야하는데 이때 붙여주는 어노테이션이 @MockBean이다.
사실 빈건 아닌데 비어있는 bean이라고 나온다.
getter가 없기 때문에 찾지 못하는것이다.
직접 getter를 만들어봤다. 아 얘가 getter를 때려서 자바 오브젝트를 json으로 변환하는구나.
그럼 getter의 이름에 대소문자를 구분하지 않아볼까?
오 때려지네? get을 때리는데 대소문자는 구분하지 않네!
그럼 소문자 겟셋터도 있고 대문자 겟셋터도 있으면 뭐가 때려질까? 터진다! 얘가 선택을 못해서 충돌난다.
이번엔 생성자를 만들어보자.
겟터를 때렸는데 없다면 풀 생성자에 값을 주입해주나?
일단 풀생성자 만드니까 객체생성시에 오류가 나네 빈생성자가 없어서.
빈생성자도 만들어주자.
안된다. 빈생성자를 무조건 호출하네.
그럼 이제 Jackson을 사용해 시리얼라이저블 하기위해 booksavereqdto에 @Getter를 붙여주자.
사실 본코드에는 필요없는데 junit에서 가짜데이터 만들기위해 붙여준거다. 테스트하기위해.
// when
ResultActions resultActions = mockMvc.perform(
MockMvcRequestBuilders.post("/api/book")
.content(body)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)); // accept 나는 json 데이터를 기대해! (필수 X)
andExpect는 내가 이걸 때렸을 때 이런 데이터가 올거라고 검증하는 코드
이걸 쓰면 when과 then이 구분이 안되기 때문에 좋지않음
// then
resultActions.andExpect(MockMvcResultMatchers.status().isCreated())
// .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("제목1"))
// .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("메타코딩"))
.andDo(MockMvcResultHandlers.print()); // 테스트하면서 일어나는 일들 log로 뿌려줌
$
: json 최고 root
. 필드명
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9