본문 바로가기

Spring/Test

[Spring] [Test] 단위테스트 작성하기 (1) - Mock객체

통합테스트 vs 단위 테스트

  • 통합테스트
    • 빈들 간에는 다양한 관계를 갖는 경우가 많다. 따라서 하나의 빈을 사용한다는 것은, 관계된 빈들도 함께 동작한다는 것을 의미한다. 따라서, "하나의 빈을 테스트할 때, 관련된 빈들이 모두 잘 동작하는지 테스트하는 것"을 통합테스트라고 한다.
  • 단위테스트
    • 하나의 빈을 테스트 할 때, "관계된 빈들과는 상관없이 해당 빈이 가지고 있는 기능이 잘 동작하는지만 확인하는 것"을 단위테스트라고 한다.
    • 단위테스트를 위해, 관계된 빈을 Mock 객체로 대신하게 된다.

MyService 클래스 단위테스트를 위해, CalculatorSerivce 객체를 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객체들을 주입받아 객체가 생성된다.

orderService가 만들어질때, mock 객체들을 주입받아 만들어진다
@InjectMock을 사용하지 않은 모습. orderService를 생성자로 직접 만들게 된다

 

 

4. @MockBean

여기서부터는, [@SpringBootTest와 함께 사용할 때 사용하는 메서드]이다

 

사실, 스프링 컨텍스트를 직접 사용하기 때문에, 원하는 객체를 주입 받는 것은 @Autowired로 하면 되지만, 가짜 객체가 아니라서 리소스가 많이 든다는 단점이 있다. 그래서 Mock 객체를 사용하는 것이고, @MockBean을 이용하여 만든다.

 

  • @Mock과는 다르게, spring영역의 어노테이션이다.
  • @MockBean은 해당 어노테이션이 붙은 클래스에 대한 mock 객체를 만들어 스프링 컨텍스트에 등록한다
  • 해당 mock객체를 사용하려면 @Autowired를 사용하면 된다.

 

 

 

 

 

 

참고 블로그

https://cobbybb.tistory.com/16

 

Mockito @Mock @MockBean @Spy @SpyBean 차이점

예제 코드 https://github.com/cobiyu/MockitoSample Test Double이 왜 필요한 지부터 시작하는 기본적인 테스트 코드부터 한 단계씩 발전시켜나가며 Mockito의 어노테이션들의 정확한 쓰임새에 대해 살펴보겠습

cobbybb.tistory.com