1. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks
의 차이를 한번 정리해 봅시다.
@XxxBean
으로 끝나면 Spring
환경에서 동작하는 어노테이션
- 아니면
Mockito
에서 제공하는 어노테이션
1 - 1. @Mock
- **
Mockito
**에서 제공하는 어노테이션.
- 테스트 대상 객체의 가짜(
mock
) 객체를 생성하여 해당 객체의 동작을 제어할 수 있다.
- **
Spring Context
**와 무관하게 동작하며, 독립적인 유닛 테스트에서 주로 사용된다.
Mocking
된 객체는 기본적으로 모든 메서드 호출에 대해 기본값(0, null, false
등)을 반환하며, when()
구문으로 특정 동작을 설정할 수 있다.
@ExtendWith(MockitoExtension.class)
class ProductServiceTest{
@Mock
private ProductRepository productRepository;
@Test
void testMock() {
when(productRepository.findAll()).thenReturn(Collections.emptyList());
// 이 테스트에서 productRepository는 가짜 객체로 동작
}
@Mock
을 사용하려면 Mockito
환경이라고 선언해줘야 한다.
1 - 2. @MockBean
- **
Spring Boot
**에서 제공하는 어노테이션.
Spring
의 **ApplicationContext
**에서 관리되는 **Bean
**을 Mock
객체로 대체한다.
- 주로 통합 테스트에서 특정 빈을
Mocking
하고 싶을 때 사용한다.
- 해당 빈의 실제 구현을 대체하여
Mocking
된 객체로 테스트할 수 있어, 특정 빈의 의존을 제거하고 싶을 때 사용한다.
@SpringBootTest
class ProductServiceTest{
@MockBean
private ProductRepository productRepository;
@Autowired
private ProductService productService;
@Test
void testMockBean() {
when(productRepository.findAll()).thenReturn(Collections.emptyList());
// productRepository는 Spring Bean으로 등록되어 있지만 가짜로 대체됨
}
1 - 3. @Spy
- **
Mockito
**에서 제공하는 어노테이션.