[spring] 테스트 코드의 @Mock, @MockBean, @InjectMocks By starseat 2023-08-16 13:03:31 java/spring Post Tags 테스트 코드를 작성 하다 보면 여러 가지의 `Mock` 들이 사용된다. 처음에 개념을 제대로 잡지 않아서인지 사용할때마다 헷갈려 이참에 정리하고자 한다. # @Mock - Mock(가짜) 객체 생성 - Mock 객체는 실제 객체 대신 동작하는 가짜 객체로, 테스트 시 원하는 결과를 반환하도록 설정 가능 # @MockBean - 스프링 컨텍스트에 Mock 객체를 등록해 `@SpringBootTest`와 함께 사용할 때 `@Autowired`가 붙은 필드에 자동으로 의존성 주입 - 이를 통해 실제로 의존하고 있는 의존 관계 대신 Mock객체를 주입해 테스트 시 예상 동작을 수행할 수 있게 함. - 스프링 애플리케이션 컨텍스트에 등록되므로 실제 Bean과 동일한 방식으로 주입 - `@Autowired` 어노테이션을 통해 Mock 객체를 주입 받을 수 있음 - 외부 의존성을 가지는 클래스에 대해 Mock 객체를 주입하여 통합 테스트를 수행하는 데 사용됨. # @InjectMocks - 테스트 대상 클래스의 인스턴스 생성 후 `@Mock` 으로 생성된 **Mock 객체**를 인스턴스에 주입 - 이를 통해 테스트 대상 객체가 필요로 하는 의존성을 쉽게 해결 - `Mockito` 프레임워크에서 사용 (`@ExtendWith(MockitoExtension.class)`) - 클래스의 인스턴스를 생성하고 Mock 객체 주입 - 클래스의 인스턴스를 직접 생성하므로 스프링 컨텍스트와는 무관하며, Mock 객체는 주입될 클래스의 필드에 `@Mock` 어노테이션을 사용하여 정의 - 클래스의 생성자 또는 `setter` 를 통해 Mock 객체 주입 - 주로 단위 테스트에서 사용되며, 클래스의 인스턴스를 생성하고 Mock 객체를 주입하여 테스트를 수행하는 데 사용됨 # 사용 예 - Service Test ```java @Service @RequiredArgsConstructor public class SampleService { private final TempService tempService; // ... } ``` ```java @ExtendWith(MockitoExtension.class) class SampleServiceTest { @InjectMocks SampleService service; @Mock TempService tempService; // ... } ``` # 결론 **@MockBean** 은 **통합 테스트**, **@InjectMocks**은 **단위 테스트** # 참조 - [@Mock vs @MockBean vs @InjectMocks](https://giron.tistory.com/115) - [[개발일지] 230509 @Mock, @MockBean, @InjectMocks의 관계](https://seungjjun.tistory.com/265) Previous Post [spring] 이벤트 Next Post [java] java 정규식 사이트 소개