Java Spring Boot Test@MockBeans应该符合@ConditionalOnBean条件吗?
我有一个javaJava Spring Boot Test@MockBeans应该符合@ConditionalOnBean条件吗?,java,spring,spring-boot,spring-boot-starter,Java,Spring,Spring Boot,Spring Boot Starter,我有一个java@Configuration类,它带有一个FOO@Bean注释,带有@ConditionalOnBean(BAR.class)。因为我希望导入程序项目提供或不提供这个Bean,所以它不存在于我的项目中的任何地方 在我的集成测试中,我通过@MockBeans模拟Bar.class。但由于某种原因,Spring引导调试告诉我它没有找到它,所以我的条件bean没有被加载 我几乎可以肯定这种情况在过去已经正常工作了,但是我是否配置了其他配置?我无法使它工作 我发现手动将@Bean重新注册
@Configuration
类,它带有一个FOO@Bean
注释,带有@ConditionalOnBean(BAR.class)。
因为我希望导入程序项目提供或不提供这个Bean,所以它不存在于我的项目中的任何地方
在我的集成测试中,我通过@MockBeans
模拟Bar.class
。但由于某种原因,Spring引导调试告诉我它没有找到它,所以我的条件bean没有被加载
我几乎可以肯定这种情况在过去已经正常工作了,但是我是否配置了其他配置?我无法使它工作
我发现手动将@Bean重新注册到与条件配置相同的@Configuration中也看不到它!是否有任何已知的bug与他的相关
自动回复:本案的罪魁祸首是
您需要非常小心bean定义的顺序
添加,因为这些条件是根据已添加的内容进行评估的
到目前为止已经处理过了。因此,我们建议仅使用
@上的ConditionalOnBean和@ConditionalOnMissingBean注释
自动配置类(因为这些类保证在
已添加任何用户定义的bean定义)
p.S2>我意识到Bar.class是一个接口,但我不明白为什么只要存在一个实现它就不能工作
p.S3>我发现MockitoTestExecutionListener是在OnBeanConCondition类之后执行的。这似乎完全是我的问题。这就是为什么不可能的原因:
- 及
@ConditionalOnBean
),所以根据BAR@bean是否存在,我将配置FOO。在引导的上下文中,我称之为“导入器”的东西有什么名字吗?不管它们当前是否应该有,如果我在测试中提供一个@MockBean
,它应该触发自动配置条件,这对我来说是完全有意义的。我建议针对BOOT提交一个bug来描述这个案例。我在自动配置类中考虑了两个问题:sis@ConditionalOnBean
?