개요
스프링 테스트에서 Mock 객체를 써야 할 때는 보통 @MockBean을 많이 사용한다.
그러나 @MockBean은 아예 원래 빈을 가짜 객체로 교체하기 때문에, 원래 구현 로직은 전혀 실행되지 않는다.
그에 비해 @SpyBean은 실제 빈을 감싸서(Spy) 일부만 Mocking 하게 도와주는 어노테이션이다.
(즉, 원래 로직은 그대로 두되 필요한 메서드만 스텁(stub) 처리할 수 있는 방식이다.)
- @MockBean → 원래 빈을 전부 Mock으로 교체
- @SpyBean → 원래 빈을 유지하면서 원하는 메서드만 Mock 처리
그래서 서비스 로직은 그대로 실행하면서, DB 접근이나 외부 API 호출 같은 특정 부분만 가짜 값으로 대체하고 싶을 때 @SpyBean을 사용한다.
이 @SpyBean을 사용할 때는 특정 메서드를 스텁(stub) 처리하는 방법에는 두 가지 문법이 있다.
doReturn(1L).when(memberService).checkUserNo(anyString());
when(memberService.checkUserNo(anyString())).thenReturn(1L);
두 문법은 비슷하지만 실제 메서드 호출 여부에 차이가 있다.
1. doReturn().when()
doReturn(1L).when(memberService).checkUserNo(anyString());
- 실제 메서드를 실행하지 않고 바로 지정한 값을 리턴한다.
- 원본 메서드가 DB 호출이나 네트워크 요청처럼 부작용을 일으킬 때 안전하게 막아준다.
2. when().thenReturn()
when(memberService.checkUserNo(anyString())).thenReturn(1L);
- 먼저 실제 메서드가 실행된 뒤, 그 결과를 감싸서 반환하도록 동작한다.
- SpyBean을 쓸 때는 원본 메서드가 그대로 호출되기 때문에 원치 않는 DB 접근이나 예외가 발생할 수 있다.
정리
- doReturn().when() → 실제 메서드 실행을 막고 값만 반환
- when().thenReturn() → 실제 메서드가 실행된 뒤 값을 스텁
따라서 @SpyBean과 같이 부분 Mocking이 필요한 상황에서는 대부분 doReturn().when()을 사용하는 것이 안전합니다.
'Study > Test' 카테고리의 다른 글
| TDD(Test Driven Development) 정리 (0) | 2023.11.30 |
|---|