Loading...
Spring Framework Reference Documentation 7.0.2의 Bean Overriding in Tests의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
테스트에서의 bean overriding은 테스트 클래스 또는 테스트 클래스의 하나 이상의 non-static 필드를
어노테이션하여, 해당 테스트 클래스의 ApplicationContext에서 특정 bean을 override할 수 있는
능력을 의미합니다.
이 기능은
DefaultListableBeanFactory의setAllowBeanDefinitionOverridingflag를true로 설정하여@Bean을 통해 bean을 등록하는 관행에 비해 위험이 덜한 대안으로 의도되었습니다.
Spring TestContext 프레임워크는 bean overriding을 위한 두 개의 어노테이션 세트를 제공합니다.
첫 번째는 순수하게 Spring에만 의존하는 반면, 두 번째 세트는 Mockito 서드파티 라이브러리에 의존합니다.
위에서 언급한 세 개의 어노테이션은 @BeanOverride 메타-어노테이션과 관련 인프라를 기반으로
구성되며, 이를 통해 커스텀 bean overriding variant를 정의할 수 있습니다.
커스텀 bean override support를 구현하려면 다음이 필요합니다.
BeanOverrideProcessor를 정의하는, @BeanOverride로 메타-어노테이션된 어노테이션BeanOverrideProcessor 구현BeanOverrideHandler 구현Spring TestContext 프레임워크에는 bean overriding을 지원하고 나머지 인프라를 설정하는 책임이 있는 다음 API의 구현이 포함되어 있습니다.
BeanFactoryPostProcessorContextCustomizerFactoryTestExecutionListenerspring-test 모듈은 후자의 두 가지
(BeanOverrideContextCustomizerFactory 및 BeanOverrideTestExecutionListener)의 구현을
자신의
META-INF/spring.factories 프로퍼티 파일에 등록합니다.
bean overriding 인프라는 테스트 클래스뿐만 아니라 테스트 클래스의 non-static 필드에 있는
어노테이션 중 @BeanOverride로 메타-어노테이션된 어노테이션을 검색하고, 해당하는
BeanOverrideProcessor를 인스턴스화하며, 이는 적절한 BeanOverrideHandler를 생성하는
책임을 집니다.
내부 BeanOverrideBeanFactoryPostProcessor는 그 다음 bean override handler를 사용하여
해당하는 BeanOverrideStrategy에 의해 정의된 대로 bean을 생성, 교체 또는 wrapping함으로써
테스트의 ApplicationContext를 변경합니다.
REPLACE
bean을 교체합니다. 해당하는 bean이 존재하지 않으면 예외를 던집니다.
REPLACE_OR_CREATE
bean이 존재하면 교체합니다. 해당하는 bean이 존재하지 않으면 새 bean을 생성합니다.
WRAP
원래 bean을 조회하고 이를 wrapping합니다.
non-singleton bean을 교체할 때, non-singleton bean은 해당하는
BeanOverrideHandler에 의해 생성된 bean override 인스턴스에 해당하는 singleton bean으로 교체되며, 해당 bean definition은singleton으로 변환됩니다. 결과적으로, handler가prototype또는 scoped bean을 override하면, override된 bean은singleton으로 취급됩니다.FactoryBean에 의해 생성된 bean을 교체할 때는,FactoryBean자체가 해당하는BeanOverrideHandler에 의해 생성된 bean override 인스턴스에 해당하는 singleton bean으로 교체됩니다.FactoryBean에 의해 생성된 bean을 wrapping할 때는,FactoryBean자체가 아니라FactoryBean에 의해 생성된 객체가 wrapping됩니다.
Spring의 autowiring 메커니즘(예를 들어,
@Autowired필드의 resolution)과는 달리, TestContext 프레임워크의 bean overriding 인프라는 bean을 찾기 위해 수행할 수 있는 휴리스틱이 제한적입니다.BeanOverrideProcessor가 override할 bean의 이름을 계산할 수 있거나, 어노테이션된 필드의 타입과 그 한정 어노테이션이 주어졌을 때 모호하지 않게 선택될 수 있어야 합니다. 일반적으로 bean은BeanOverrideFactoryPostProcessor에 의해 "타입으로" 선택됩니다. 또는 사용자가 커스텀 어노테이션에서 bean 이름을 직접 제공할 수도 있습니다.BeanOverrideProcessor구현은 컨벤션 또는 다른 방식에 기반하여 bean 이름을 내부적으로 계산할 수도 있습니다.
Dependency Injection of Test Fixtures
Testing Request- and Session-scoped Beans