我正在编写集成测试,它只适用于特定的配置文件。问题是我应该从application.properties文件中的spring.profiles.active值获取配置文件名称。但是由于application.properties的实际价值,我总是得到null。
我为main方法创建了一个显式将值放入System.properties:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Autowired
public MyApplication(Environment environment) {
String property = "spring.profiles.active";
System.getProperties().setProperty(property, environment.getProperty(property));
}
但值仍为空。 在测试类中,我使用以下注释:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyApplication.class)
@SpringBootTest(classes=MyApplication.class)
从主类中加载上下文,我手动设置必要的值。
也尝试使用@TestPropertySource("classpath:application.properties")
但没有任何帮助。我不能硬编码这个价值。它应该只来自application.properties
更新 这是我的错。我从静态方法尝试了getValue:/ 也许有人知道如何通过使用这个值来禁用类测试? @IfProfileValue仍然返回null,因此不适合。
更新 我已经意识到禁用是没用的,只需使用@SpringBootTest使用适当的配置(classes = AppropriateConfigClass.class)
我会选择 gargkshitiz 回答,因为他是唯一一个试图提供帮助的人。
答案 0 :(得分:4)
你已经到了一半。 @TestPropertySource
从src/test/resources
读取。使用重写值添加src/test/resources/application.properties
,您应该完成。
答案 1 :(得分:0)
@gargkshitiz的答案是完美的!
如果您只有要阅读的属性spring.profiles.active
,那么您可以按照以下方式提及它(它将使我们免于维护属性文件)。
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
value={"spring.profiles.active=yourActiveProfileName"})
您还可以指定多个属性
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
value={"spring.profiles.active=yourActiveProfileName",
"spring.some.other.property=propertyValue"})
如果您不需要,可以放弃webEnvironment = WebEnvironment.RANDOM_PORT
。