통합테스트 vs 단위 테스트
- 통합테스트
- 빈들 간에는 다양한 관계를 갖는 경우가 많다. 따라서 하나의 빈을 사용한다는 것은, 관계된 빈들도 함께 동작한다는 것을 의미한다. 따라서, "하나의 빈을 테스트할 때, 관련된 빈들이 모두 잘 동작하는지 테스트하는 것"을 통합테스트라고 한다.
- 단위테스트
- 하나의 빈을 테스트 할 때, "관계된 빈들과는 상관없이 해당 빈이 가지고 있는 기능이 잘 동작하는지만 확인하는 것"을 단위테스트라고 한다.
- 단위테스트를 위해, 관계된 빈을 Mock 객체로 대신하게 된다.
단위테스트 해보기
의존성 주입
- mockito-core와 mockito-junit-jupiter를 추가해주자
- mockito-core : mockito가 제공해주는 기본적인 라이브러리
- mockito-junit-jupiter : junit 테스트에서 mockito를 연동해서 사용할 수 있는 junit 확장 구현체
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.8.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.8.0</version>
<scope>test</scope>
</dependency>
Mock객체 만드는 방법
기본 골자는, 한 객체가 다른 빈의 주입을 받는 경우에, 다른 빈들을 mock 객체로 대신해주면 되는 것이다.
mock 객체를 만들어주는 어노테이션을 살펴보자.
대표적인 어노테이션이, @MockBean(스프링부트 사용)과, @Mock(스프링부트 미사용) 이다. 아래의 표를 참고해 기억하자.
- @Mock은 @InjectMocks에 대해서만 해당 클래스안에서 정의된 객체를 찾아서 의존성을 해결합니다.
- @MockBean은 mock 객체를 스프링 컨텍스트에 등록하는 것이기 때문에 @SpringBootTest를 통해서 Autowired에 의존성이 주입되게 됩니다.
1. Mockito.mock()
- 가장 기본적인 방식이다.
2. @Mock
- @ExtendWith(MockitoExtension.class)가 필요하다
- @Mock은, Mockito.mock()을 대체하는 것이다
- 주입받기를 원하는 객체에 @Mock을 붙여주면, mock 객체가 생성되어 주입된다
3. @InjectMocks
- 해당 어노테이션이 붙은 클래스는, 자신의 객체 생성 시 필요한 Mock 객체들을 감지하여, 객체 생성 시 Mock객체들을 주입받아 객체가 생성된다.
4. @MockBean
여기서부터는, [@SpringBootTest와 함께 사용할 때 사용하는 메서드]이다
사실, 스프링 컨텍스트를 직접 사용하기 때문에, 원하는 객체를 주입 받는 것은 @Autowired로 하면 되지만, 가짜 객체가 아니라서 리소스가 많이 든다는 단점이 있다. 그래서 Mock 객체를 사용하는 것이고, @MockBean을 이용하여 만든다.
- @Mock과는 다르게, spring영역의 어노테이션이다.
- @MockBean은 해당 어노테이션이 붙은 클래스에 대한 mock 객체를 만들어 스프링 컨텍스트에 등록한다
- 해당 mock객체를 사용하려면 @Autowired를 사용하면 된다.
참고 블로그
https://cobbybb.tistory.com/16