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
'DEVELOP > Backend' 카테고리의 다른 글
LangChain 이란? (2) | 2023.12.04 |
---|---|
jsonString의 다형성 (feat. Gson) (0) | 2022.04.05 |
[Spring] DataAccessException 이란? (Spring의 예외처리 - 사라진 SQLException) (0) | 2021.05.20 |
[Spring] @RestControllerAdvice , @ExceptionHandler 로 예외 처리하기 (0) | 2021.05.20 |
[Spring] Application Event란? 업무에서 어떻게 이용 할 수 있을까? (0) | 2020.06.28 |