반응형
@MockBean vs @Mock + @ExtendWith(MockitoExtension.class)
@MockBean
- 스프링 컨텍스트에 mock 객체를 빈으로 등록하여, 테스트 대상 클래스에 필요한 의존성을 스프링 빈으로 주입해 줍니다.
- 주로 통합 테스트에서 mock 객체를 주입할 때 사용합니다.
- 스프링 컨텍스트가 활성화된 상태에서 mock 객체를 주입할 수 있습니다.
@SpringBootTest
class MyTest {
@MockBean
private MyService myService; // 스프링 컨텍스트에 등록된 목 객체
@Autowired
private MyController myController; // MyService 목 객체가 주입됨
@Test
void testSomething() {
// myController는 myService 목 객체를 주입받음
}
}
📌 스프링 컨텍스트 내에서 실제 빈처럼 Mock 객체를 동작시킵니다.
@Mock + @ExtendWith(MockitoExtension.class)
- 스프링 컨텍스트없이 순수한 Mockito 기반의 Mock 객체를 사용할 때 사용합니다.
- @Mock을 통해 mock 객체를 생성하고, MockitoExtension이 해당 mock 객체를 테스트 클래스에 주입해 줍니다.
- 스프링 컨텍스트를 로드하지 않기 때문에 스프링과 무관한 단위 테스트로 진행됩니다.
@ExtendWith(MockitoExtension.class)
class MyTest {
@Mock
private MyService myService; // Mockito 목 객체
@InjectMocks
private MyController myController; // MyService가 주입된 MyController
@Test
void testSomething() {
// myController는 myService 목 객체를 주입받음
}
}
📌 스프링 컨텍스트를 로드하지 않고, mock 객체만 의존성 처리를 합니다.
왜 @MockBean을 사용하면 @ExtendWith(MockitoExstension.class)가 필요 없는가
- 스프링이 Mockito를 직접 관리합니다.
- 주로 @SpringBootTest와 @MockBean을 같이 사용하여 통합 테스트 작성에 사용하며 스프링이 빈들을 관리해 줍니다.
- @MockBean을 사용하면 스프링 컨텍스트 내에서 Mockito 목 객체를 빈으로 관리합니다. 스프링이 필요한 목 객체를 자동으로 생성하고 주입하므로, mockextension이 필요 없습니다.
- 테스트 목적 차이
- @MockBean은 주로 스프링 통합 테스트에서 사용되어, 스프링 컨텍스트 내에서 목 객체를 주입해 줍니다.
- 반면, @ExtendWith(MockitoExtenstion.class)는 스프링 컨텍스트를 로드하지 않고, mock 객체만 이용해 테스트하는 단위 테스트에 사용됩니다.
반응형