오늘 강의에서 스프링에서 3.4의 새로운 버전이 나왔다는 사실을 알게 되었다
이때 추가된 개념에는 기존 @MockBean이 deprecated 되고 @MockitoBean으로 대체되었다는 점이 있었다
그래서 오늘은 @MockitoBean을 알아보고자한다
Spring Boot 의 공식 깃허브에는 다음과 같이 나타내고있다
Deprecation of @MockBean and @SpyBean
@MockBean and @SpyBean have been deprecated in favor of @MockitoBean and @MockitoSpyBean in Spring Framework. The functionality provided by the Spring Framework annotations is not exactly the same as that offered by Spring Boot. For example, @MockitoBean is not supported on @Configuration classes and you may need to migrate to annotating fields on a test class instead.
위에 따르면 대체된 @MockitoBean 은 @Configuration 클래스에서 사용될 수 없으며 대신에 테스트 클래스의 필드에 @MockitoBean을 선언하는 방식으로 마이그레이션해야 한다
configuration 어노테이션을 잠깐 짚고 넘어가면 다음과 같다
이 어노테이션은 하나 이상의 @Bean 메서드를 포함하며, 이러한 메서드들은 애플리케이션 컨텍스트에서 관리되는 빈을 생성하는 역할을 한다
@Configuration 클래스는 내부적으로 @Component를 포함하고 있어, 컴포넌트 스캔의 대상이 된다
따라서 @ComponentScan을 통해 자동으로 스캔되어 빈으로 등록된다
@Configuration 어노테이션을 사용하면 설정 클래스 내의 @Bean 메서드들이 프록시(proxy) 패턴을 통해 관리되어 동일한 빈이 여러 번 호출되더라도 항상 동일한 인스턴스를 반환하여 싱글톤을 보장한다
@MockitoBean은 테스트 클래스의 ApplicationContext에서 특정 빈을 Mockito mock 객체로 대체하기 위해 사용되는 어노테이션이다
이 어노테이션은 @Target({FIELD, TYPE})로 필드와 타입 레벨에서 적용될 수 있으며, @Retention(RUNTIME)으로 런타임까지 유지된다
또한, @Documented와 @Repeatable(MockitoBeans.class)로 문서화되고 반복적으로 사용할 수 있다 @BeanOverride(org.springframework.test.context.bean.override.mockito.MockitoBeanOverrideProcessor.class)를 통해 Spring의 빈 오버라이드 메커니즘과 통합된다
@MockitoBean은 다음과 같은 방식으로 적용할 수 있다:
- 테스트 클래스나 그 상위 클래스의 non-static 필드에 적용
- @Nested 테스트 클래스의 외부 클래스나 그 상위 클래스의 non-static 필드에 적용
- 테스트 클래스나 그 상위 클래스, 또는 구현된 인터페이스의 타입 레벨에 적용
- @Nested 테스트 클래스의 외부 클래스나 그 상위 클래스, 또는 구현된 인터페이스의 타입 레벨에 적용
필드에 @MockitoBean을 선언하면, 모킹할 빈은 해당 필드의 타입으로부터 추론된다
ApplicationContext에 여러 후보가 있는 경우에 @Qualifier 어노테이션을 사용하여 구체적으로 지정할 수 있으며 @Qualifier가 없을 경우 필드의 이름이 대체 식별자로 사용된다
또한 value나 name 속성을 설정하여 명시적으로 모킹할 빈의 이름을 지정할 수 있다
타입 레벨에서 @MockitoBean을 선언할 때는, types 속성을 통해 모킹할 빈의 타입을 지정해야 한다
ApplicationContext에 여러 후보가 있는 경우, name 속성을 설정하여 특정 빈을 지정할 수 있다
단, name 속성을 설정할 때는 types 속성에 단일 타입만 포함되어야 한다
해당하는 빈이 존재하지 않을 경우 새로운 빈이 생성된다
그러나 빈이 존재하지 않을 때 테스트를 실패하게 하려면 enforceOverride 속성을 true로 설정할 수 있다
예를 들어, @MockitoBean(enforceOverride = true)와 같이 사용한다
ApplicationContext에 알려져 있지만 빈으로 등록되지 않은 의존성(예: 직접 등록된 의존성)은 발견되지 않으며, 기존 의존성과 함께 모킹된 빈이 컨텍스트에 추가된다
주의할 점은 오직 싱글톤 빈만 모킹할 수 있다는 것이다
싱글톤이 아닌 빈을 모킹하려고 하면 예외가 발생한다
FactoryBean에 의해 생성된 빈을 모킹할 때는, FactoryBean이 해당 객체의 싱글톤 모킹 객체로 대체된다
@MockitoBean 필드는 가시성에 제한이 없으므로 프로젝트의 필요나 코딩 관례에 따라 public, protected, package-private(기본 가시성), private으로 선언할 수 있다
@MockitoBean 필드와 타입 레벨의 @MockitoBean 선언은 기본적으로 외부 테스트 클래스에서 상속된다
@MockitoBean은 사용자 정의 어노테이션을 만들기 위해 메타 어노테이션으로 사용될 수 있다
예를 들면 테스트 전반에서 단일 어노테이션에서 공통 모킹 구성을 정의하는 것이 있
또한, 타입 레벨에서 반복 가능한 어노테이션으로 사용될 수 있다
예를 들어 여러 빈을 이름으로 모킹할 수 있다
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
Spring Boot 3.4 Release Notes
Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss. - spring-projects/spring-boot
github.com
MockitoBean (Spring Framework 6.2.3 API)
Name of the bean to mock. If left unspecified, the bean to mock is selected according to the configured types or the annotated field's type, taking qualifiers into account if necessary. See the class-level documentation for details.
docs.spring.io
오늘도 하나 알아가서 좋다
내일은 더 열심히 공부하자 화이팅 ~ !
'[Kotlin&Spring] 5기 내일배움캠프' 카테고리의 다른 글
| [Kotlin&Spring] 5기 아웃소싱 프로젝트 트러블슈팅 - AOP 에러 해결 (1) | 2025.03.07 |
|---|---|
| [Kotlin&Spring] 5기 Spring 심화 과제 트러블슈팅 (0) | 2025.02.27 |
| [Kotlin&Spring] 5기 JPA 연관 관계 매핑과 N+1 문제 (1) | 2025.02.24 |
| [Kotlin&Spring] 5기 운영체제에서 출발한 동기화 문제와 DB 로딩 전략 (0) | 2025.02.13 |
| [Kotlin&Spring] 5기 일정 관리 앱 만들기 트러블슈팅 -JPQL (0) | 2025.02.12 |