如此混淆的是,
@IfProfileValue
与
@Profile
或
@ActiveProfiles
没有任何关系。这是正确的,并且我在这里详细解释了这一点:
https://dev59.com/j2Ag5IYBdhLWcg3wbqd4#23627479 我假设你已经看到了它,因为你昨天评论了我的答案。
@IfProfileValue
与
@Profile
或
@ActiveProfiles
无关的原因是由于框架的演变。有关详细信息,请参见下面的内容。
@Profile
测试是否激活配置文件,
@ActiveProfiles
将它们设置为活动状态,
@IfProfileValue
允许您在Spring
Environment
中检查内容。这些陈述不完全正确,特别是最后一部分。
@Profile
被用于有选择地启用一个组件(例如@Service
等)、@Configuration
类或@Bean
方法,如果Spring的Environment
为ApplicationContext
激活了其中一个命名的bean定义配置文件。该注释与测试无直接关系:@Profile
不应在测试类上使用。
@ActiveProfiles
用于指定哪些bean定义配置文件(例如通过@Profile
声明的那些)在加载集成测试的ApplicationContext
时应处于活动状态。
@IfProfileValue
不允许您检查Spring的Environment
中的事情。我不确定您为什么会这样假设,因为Spring Framework的文档中没有提到。正如我在前面提到的帖子中所述:
请注意,@IfProfileValue
是在Spring Framework 2.0中引入的,远在bean定义配置文件的概念之前,而@ActiveProfiles
是在Spring Framework 3.1中首次引入的。
在上述主题中,我还指出了以下内容:
考虑到@IfProfileValue
的语义,术语“配置文件”可能会产生误导。关键是要考虑“测试组”(例如TestNG中的测试组),而不是“配置文件”。请参见JavaDoc for @IfProfileValue中的示例。
我如何使用@IfProfileValue
来检测是否已激活配置文件?
这取决于情况,我假设你说“配置文件”时是指bean定义配置文件。
如果您正在使用@ActiveProfiles
来设置测试的bean定义配置文件,则不能使用@IfProfileValue
来确定是否激活了bean定义配置文件,因为通过@ActiveProfiles
配置的bean定义配置文件直接设置在测试的ApplicationContext
中,而不是作为Java系统属性。
然而,如果您仅通过
spring.profiles.active
系统属性设置
bean 定义配置文件,则可以使用
@IfProfileValue
来确定是否激活了一个
bean 定义配置文件,因为
@IfProfileValue
实际上是使用系统属性工作的。例如,您可以使用以下内容:
@IfProfileValue(name = "spring.profiles.active", value = "test")
我试过
@IfProfileValue(name = "activeProfiles", value = "test")
,但似乎测试被跳过了,这意味着它不匹配。
那行不通,因为
activeProfiles
是错误的属性名称。正确的系统属性名称是
spring.profiles.active
。有关详细信息,请参见
AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME
。
@IfProfileValue
与 @ActiveProfiles
不兼容是 Spring 团队已知的问题。如果您想了解更多详情并参与讨论,请参考以下 JIRA 问题。
希望这能为您澄清情况!Sam(Spring TestContext Framework的作者)
spring.profiles.active
是否与特定配置文件匹配将失败,因为存在多个逗号分隔的配置文件名称。 - Shawn Clark@Profile
吗?请参见https://stackoverflow.com/q/53313489/4106030 - badera