使用addActiveProfile的带有自定义初始化程序的Spring @ContextHierarchy给出了NoSuchBeanDefinitionException

时间:2014-12-01 07:17:31

标签: spring

我们在测试中使用@ContextHierarchy来启用上下文缓存,但允许一些文本自定义上下文。我有一个问题,一个测试需要激活一个特定的Spring配置文件,它激活一个被注入测试的bean。

我有一种感觉这是不可能的,但我正在寻找确认。逻辑上,父上下文已经初始化,所以我愿意相信Spring会根据在测试中激活的配置文件重新连接父上下文的问题,该测试基本上只是通过@ContextHierarchy添加子上下文。但是在谷歌搜索之后我找不到任何描述这个问题的人。

基础测试类如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy(
    @ContextConfiguration(classes = BaseConfig.class, initializers =  TestContextInitialiser.class)
)
public abstract class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
...
}

具体测试类如下所示:

@ContextHierarchy(
    @ContextConfiguration(initializers = NotificationTest.CustomInitializer.class)
)
public class NotificationTest extends BaseTest {
    @Autowired
    private EventsConfig eventsConfig; // bean that needs to be activated via profile

    ...

    public static class CustomInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            applicationContext.getEnvironment().addActiveProfile("EVENTS_ENABLED");
        }
    }
}

EventsConfig类使用@Profile ...

@Component
@Profile("EVENTS_ENABLED")
public class EventsConfig {
    ...
}

Spring的错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [xxx.EventsConfig] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我希望Spring在这种情况下至少会发出警告/错误,并解释无法使用新的配置文件修改父上下文。

任何输入/指导表示赞赏。这或类似的东西可能吗?重构此测试以避免使用基类将是一件痛苦的事。

由于

0 个答案:

没有答案