Test Double 이란?

실제 객체를 대신해서 테스팅에서 사용하는 모든 방법을 일컬어 호칭한다. 

Java 진영에서는 대표적으로 Mockito가 있습니다.



Mockito의 어노테이션

@Mock
@MockBean
@Spy
@SpyBean
@InjectMocks



1. Java의 test double : Mockito

1. @Mock

Mockito.mock() 코드를 대체

@Mock으로 mock 객체 생성


 

1.2 @InjectMocks

해당 클래스가 필요한 의존성과 맞는 Mock 객체들을 감지하여 , 해당 클래스의 객체가 만들어질때 사용하여

객체를 만들고 해당변수에 객체를 주입하게된다.

1.2 @Spy

- 실제 객체의 스파이를 생성하여 실제 객체의 메소드를 호출 할 수 있게 합니다.

- stub 하면 stub 하는 객체 , 아니면 실제 객체를 호출 합니다. 
- 하나의 객체를 선택적으로 stub 할 수 있도록 하는 기능 

- mockito.spy()도 사용가능

- When Returns 해서 어떤값이 들어갔을때 해당 값이 리턴되도록 미리 선언해둔다

이유는.. 해당 method는 부가적인 기능이라 중점적인 기능을 test 하기위해 미리 선언해두는 것을 stubbing이라고 한다.

- 둘의 가장 큰 차이점은 @Spy 실제 인스턴스를 사용해서 mocking을 하고, @Mock은 실제 인스턴스 없이 가상의 mock 인스턴스를 직접 만들어 사용한다는 것이다. 그래서 @Spy Mockito.when() 이나 BDDMockito.given() 메서드 등으로 메서드의 행위를 지정해 주지 않으면 @Spy 객체를 만들 때 사용한 실제 인스턴스의 메서드를 호출한다.

 

stubbing 예제

// stubbing
when(mockedList.get(0)).thenReturn("ok");
when(mockedList.get(1)).thenThrow(new RuntimeException());

 

- @Spy 는 객체 instance의 초기화를 해주어야한다 

@Spy
List<String> spyList = new ArrayList<String>(); //초기화

@Test
public void whenUsingTheSpyAnnotation_thenObjectIsSpied() {
    spyList.add("one");
    spyList.add("two");

    Mockito.verify(spyList).add("one");
    Mockito.verify(spyList).add("two");

    assertEquals(2, spyList.size());
}



2. SpringBootTest의 Test double


1. @MockBean


@MockBean은 스프링 컨텍스트에 mock객체를 등록하게 되고 스프링 컨텍스트에 의해 @Autowired가 동작할 때 등록된 mock객체를 사용할 수 있도록 동작합니다.

 


- Spring 영역의 어노테이션
- @Mock은 @InjectMocks에 대해서만 해당 클래스안에서 정의된 객체를 찾아서 의존성을 해결합니다.
- @MockBean은 mock 객체를 스프링 컨텍스트에 등록하는 것이기 때문에 @SpringBootTest를 통해서 Autowired에 의존성이 주입되게 됩니다.

- @Autowired라는 강력한 어노테이션으로 컨텍스트에서 알아서 생성된 객체를 주입받아 테스트를 진행할 수 있도록 합니다.

Mock 종류

의존성 주입
@Mock @InjectMocks 
@MockBean @Autowired

 

 


2. @SpyBean

- @MockBean과 마찬가지로 스프링 컨테이너에 Bean으로 등록된 객체에 대해 Spy를 생성

- @SpyBean이 Interface일 경우 구현체가 반드시 Spring Context에 등록되어야 합니다. => 등록되지 않은 상태라면, @MockBean을 사용하는 것이 좋은 방법이 될 수 있습니다.

- @SpyBean은 실제 구현된 객체를 감싸는 프록시 객체 형태이기 때문에 스프링 컨텍스트에 실제 구현체가 등록되어 있어야 합니다.


참고

https://cobbybb.tistory.com/16

https://www.baeldung.com/mockito-spy

https://velog.io/@june0313/Mockito-Mock-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%A3%BC%EC%9E%85%ED%95%98%EA%B3%A0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%95%98%EA%B8%B0

+ Recent posts