Mock이란?
객체간 의존성이 있는 객체를 대신하는 가짜 객체
개발한 프로그램을 테스트 할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 흉내내는 가짜 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다.
Mock 객체가 필요한 순간
- 테스트 작성을 위한 환경 구축이 어려운 경우
- 테스트가 특정 경우나 순간에 의존적인 경우
- 테스트 시간이 오래 걸리는 경우
- 서버나 PC의 성능문제로 오래 걸릴 수 있는 시간을 단축하기 위해 사용
JUnit 어노테이션(annotation)
@SpringBootTest
테스트 클래스에 SpringBootTest
어노테이션을 사용하면 해당 테스트를 진행하기 위해 SpringBoot 서버 전체를 띄운다.
- 어플리케이션
레벨 테스트
시 사용한다.
- 서버 프로그램의 환경설정, 포트, 주소 등 실행될 때의 런타임 테스트
- 통합 테스트 수행시 적합하다.
- 테스트 실행시 서버 어플리케이션이 실행된다.
- 실제 구동되는 어플리케이션과 똑같은
Application Context
를 로드한다.
- 어플리케이션이 로드되기 때문에 어플리케이션에 커질 경우 속도가 느려진다.
@WebMvcTest
- MVC를 위한 테스트
- 대표적으로
Controller 테스트
를 할 때 사용한다.
- Request, Response를 테스트 할 수 있는 어노테이션이다.
- Spring Security가 제공하는 로그인, 로그아웃, 세션, 필터도 자동으로 테스트 가능하다.
- @SpringBootTest 어노테이션을 이용해도 @WebMvcTest에서 가능한 테스트는 모두 가능하지만 어플리케이션 컨텍스트를 통해 서버 앱을 전부 로드하는 것이 아닌, MVC관련 어노테이션(@Controller, @ControllerAdvice, @JsonComponent)과 Filter, WebConfigurer, HandlerMethodArgumentResolver만 로드하기 때문에 가볍다.
@DataJpaTest
- JPA관련 테스트 설정만을 로드한다.
- DataSource의 설정 유효성, 정상 여부, DDL, DML의 정상 수행 여부 등의 테스트가 가능하다.
@RestClientTest
- 클라이언트의 요청을 서버가 정상적으로 수행하는지를 검증하기 위한 테스트이다.
@JsonTest
- JSON의 직렬화, 역직렬화 등을 테스트한다.
@BeforeEach
- 현재 클래스의 각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 메소드보다
먼저
메소드가 실행되어야 함을 의미한다.
- 비즈니스 로직이 복잡해지고 테스트에 여러 초기화가 필요하다면 여러 개의 @BeforeEach 메소드를 만들 수 있다.
- 다만 초기화 메소드들 사이의 실행 순서는 보장되지 않으니 순서가 필요한 경우에는
@Order
어노테이션을 사용해 순서를 지정해준다.
@AfterEach
- 현재 클래스의 각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 메소드
이후에
메소드가 실행되어야 함을 의미한다.
- 테스트가 실패해도 수행된다.
📚참고
위키백과: 모의객체