【发布时间】:2018-11-21 10:08:01
【问题描述】:
我尝试为我的单元测试加载第二个属性文件, 这会覆盖一些属性。
在@Configuration 上使用@PropertySource 加载它不起作用,
用@TestPropertySource 加载它也不起作用。
只有在@TesPropertySource 上直接设置properties 才有效,
但是当我尝试将它变成元注释时它不起作用。
这是一个示例项目:https://github.com/cptwunderlich/SpringTestProperties
我更愿意加载一个文件来影响所有测试(例如使用@PropertySource),但如果这不起作用,至少有一个自定义元注释会很好,所以我不必把它放在每一个测试中。
基本上我想不将一些数据导入数据库以进行测试(spring.datasource.data),然后还要更改使用的数据库 - 无需复制整个配置并且必须在两个地方更改它时间。
重要的部分:
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class TestconfigApplicationTests {
@Value("${my.test.property}")
private String testproperty;
@Test
public void assertValue() {
Assert.assertEquals("foobar", testproperty);
}
}
或者配置类在测试包中:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}
更新:
答案中的主要建议是使用@ActiveProfile 激活“test”配置文件,这将导致加载“application-test.yaml”。
这比@TestPropertySource 好,但我仍然需要在每个测试类上添加注释。我尝试创建一个元注释 - should work - 所以至少我只有一个自定义注释可以捆绑其他设置。但这不起作用。
完美的解决方案是使用一个配置类全局设置这些设置,而不必在每个测试上添加注释。
我仍在寻找那个解决方案,或者至少在结束这个问题之前调试元注释。 编辑:我创建了一个 Jira 问题:SPR-17531
编辑
好的,我有点困惑,所以我重新测试了所有不同的组合:
-
@TestPropertySource(locations = "classpath:application-test.properties")在测试中,实际上现在有效。嗯。 -
@ActiveProfiles("test")测试作品。 - 带有
@ActiveProfiles的元注释不工作。编辑:确实... - 任何类型的全局配置(TestPropertySource、ActiveProfiles、Propertysource)不起作用
- (在 test/resources 中拥有 application.properties 也不起作用,bc。它不会覆盖单个属性,而是覆盖整个文件,即,我需要重新定义和复制所有内容。)
编辑:
好吧,我错了。元注释确实有效 - 我忘记设置保留策略,默认为 CLASS。添加@Retention(RUNTIME) 可以解决此问题。
似乎没有办法在代码中全局设置它(即,无需在我的 IDE 中配置测试的运行方式),所以我现在必须使用配置文件。
【问题讨论】:
-
我建议阅读 Spring Boot 参考指南,了解 Spring Boot 中的属性如何工作(参见 docs.spring.io/spring-boot/docs/current/reference/html/…)。简而言之,使用
@ActiveProfiles("test")和spring boot 将同时加载application.properties和application-test.properties。后者将覆盖前者的属性。
标签: java spring unit-testing spring-boot spring-boot-test