Spring, Spring Boot

[Spring Boot] JUnit4 + Mock Test

Yoon 2022. 5. 16. 23:41

Mock?

Mock이란 테스트 코드를 위해 실제 사용되는 객체를 불러오기 어려울 때

가짜 객체를 만들어 사용하는 기술을 말한다.

 

이번 포스팅에선 단위 테스트 프레임워크인 JUnit4 와 Mock을 이용한 테스트 방법을 소개하겠다.


예제 1

@WebMvcTest

먼저 MockMvc를 사용하기 위해선 @WebMvcTest 어노테이션이 필요하다.

(@WebMvcTest 어노테이션은 MockMvc를 자동으로 구성하여 테스트 가능하도록 해준다.)

MockMvc - 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현할 수 있는 라이브러리

 

Controller

Test

perform() - 요청하는 역할을 함

    get() - get 방식으로 url 호출

    content() - Request Body에 값을 넣어 요청 파라미터를 지정함

    contentType() - 지정한 타입으로 요청 파라미터를 보내겠다는 설정

 

andExpect() - 예상 값을 검증하는 메소드

    status().isOk() - Response Status 값이 200인지 체크

    content().string() - Response Body 데이터를 스트링 형태로 가져옴

 

andDo() - 요청에 대한 처리하는 메소드

   print() - 요청/응답 등 전체 처리 결과를 출력

테스트 Console Log

Request Log

Response Log


예제 2

Controller

Test

이번 테스트는 가짜 MemberService Bean을 생성하여 (@MockBean)

 

MemberService의 findMember 메소드를 호출했을 때

무조건 NullPointerException을 발생시키도록 지정하였다. (given)

 

mockMvc.perform으로 URL 요청 테스트를 진행할 때,

컨트롤러에서 findMember를 호출하면 NullPointerException을 발생시킨다.

 

그 이유는 위에서 말했듯이 findMember를 호출하면 NullPointerException을 발생 시키는 시나리오를

가짜 빈 MemberService가 가지고 있고 컨트롤러에 시나리오를 가지고 있는

MemberService 가짜 빈이 주입되어있기 때문이다.

 

39Line

응답에 대한 테스트는 당연히 NullPointerException이 발생할 것이기 때문에 

컨트롤러에서 NullPointerException을 던졌는지 검증한다. 

 

getResolvedException() - 어떤 Exception을 던졌는지 알려주는 메소드

isAssignableFrom() - 특정 class가 특정 Class, Interface를 상속하거나 구현했는지를 boolean으로 리턴해주는 메소드

 

 

이런 식으로 Mock을 이용하면, 실제 로직과 동일하게 처음부터 끝까지 구현을 안하면서

단위적으로 응답에 대한 예측 테스트를 수행할 수 있다.