Loading...

Spring/Tistory / / 2022. 5. 31. 12:05

JUnit5 컨트롤러 @WebMvcTest

반응형

 

이전에 서비스 테스트할때는 얘를 모키토 영역에 띄웠기 때문에 상관없었는데

컨트롤러 테스트할 때는 @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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형