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을 이용하면, 실제 로직과 동일하게 처음부터 끝까지 구현을 안하면서
단위적으로 응답에 대한 예측 테스트를 수행할 수 있다.
'Spring, Spring Boot' 카테고리의 다른 글
[JPA] JPA? JPA의 특징과 장단점 (0) | 2022.09.25 |
---|---|
[Spring Boot] JPA + H2 DATABASE (0) | 2022.09.13 |
[Spring Boot] HTTP 통신을 위한 OpenFeign (0) | 2022.05.08 |
[Spring Boot] HTTP 통신을 위한 RestTemplate사용 (0) | 2022.05.07 |
[Spring Boot] MyBatis typeAlias 지정하기 (0) | 2022.04.01 |