MockBen으로 테스트 코드 작성하기

Eunkyung·2022년 1월 23일
0

Spring

목록 보기
5/6

스터디 때 MockMvc에 대해서 알게 되었고 바로 적용해보았다.

MockMvc를 사용하면 실제 서블릿 컨테이너를 사용하지 않고 가짜 서블릿 컨테이너를 통해 Http Method 응답을 테스트할 수 있다.

처음 테스트 코드를 작성했을 때 @SpringBootTest, @AutoConfigureMockMvc 어노테이션을 사용하였는데 이 경우 컨트롤러뿐만 아니라 @Service, @Repository 어노테이션이 붙은 모든 것들을 주입받아 무겁다는 단점이 있다.

찾아보니까 특정 컨트롤러나 컨트롤러에 대해서만 테스트할 경우 WebMvcTest 어노테이션을 사용하면 되는데 이는 @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor 만 스캔하여 @SpringBootTest 어노테이션보다 가볍게 테스트할 수 있다는 장점이 있다고 한다. 한편, 요청부터 응답까지 모든 테스트를 mock 기반으로 테스트하기 때문에 실제 환경에서 제대로 동작하지 않을 수도 있다고 한다,,!

나는 @SpringBootTest를 사용하여 테스트에 성공하여 @WebMvcTest를 사용하여 테스트 해보고 싶었다.

먼저, MainController에 대해서 테스트를 진행하겠다는 의미로 특정 컨트롤러를 명시해주었다.

@WebMvcTest(MainController.class)

그 다음 컨트롤러가 의존하고 있는 서비스를 주입해주었다.

@MockBean
private JwtServiceImpl jwtService;

마지막으로 다음과 같이 코드를 작성하여 테스트를 진행하였다.

// when 
mockMvc.perform(post("/startPayment") // 브라우저에서 서버에 URL 요청을 하듯 컨트롤러 실행 가능
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(payload)))

                // then
                .andExpect(status().isOk()) // 응답 검증
                .andDo(print()); // 요청 및 응답 전체 메세지 확인

문제는 SpringBootTest 어노테이션을 사용하여 테스트할 경우 Response Body가 정상적으로 출력되나 MockBean 어노테이션을 사용하여 테스트할 경우 Response Body가 null도 아니고 empty였다!

의존성 주입 문제인줄 알고 4일동안 고민하다가 훌륭한 선생님들의 도움을 받아 해결할 수 있었다.
MockBean 어노테이션을 사용하여 Service 객체를 주입할 경우 가짜 Serive 객체가 생성되어 해당 메서드의 실행 결과에 대한 테스트 코드를 작성해줘야 하는데 나의 경우에는 이 부분에 대한 테스트 코드를 작성하지 않았다.

즉, Service의 어떤 메서드의 return값이 String이라면 when thenReturn으로 해당 메서드의 리턴값에 대한 코드를 작성해야 한다.

final String expectedUrl = "aa@aa.com"
when(paymentService.returnRedirectUrl(json)).thenReturn(expectedUrl);

returnRedirectUrl의 return값이 string이라면 다음과 같은 방법으로 코드를 작성해야 Response Body에 결과값이 리턴된다.

오랜 시간 삽질하면서 쌓여있던 답답한 감정들이 시원하게 내려갔다. 새로 알게될 때마다 매번 새롭고 아직 배울 게 한참 많다는 것을 새삼 깨닫게 되었다.

profile
꾸준히 하자

0개의 댓글