我尝试配置一个在进行 springboot 测试时使用 test 属性的类
应用程序.属性
meta=value
应用程序测试.属性
meta=value-test
@Configuration
@TestPropertySource("/application-test.properties")
public class AppConfig {
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AppConfig.class, TestService.class})
//@TestPropertySource("/application-test.properties")
public class SpringTest {
@Autowired
private TestService testService;
@Value("${meta}")
private String value;
@Test
public void test() {
System.out.println(value); // "value"
}
}
当
@TestPropertySource("/application-test.properties")
注释在SpringTest
上时,“元”值将从application-test.properties
读取为“值测试”。
但是当
@TestPropertySource("/application-test.properties")
仅在AppConfig.class
上注释时,这将不起作用。 “元”值将从 application.properties
读取为“值”。
我想要实现的是每个尝试加载 AppConfig.class 的 Spring 测试都会自动使用 application-test.properties 。
我怎样才能实现这个目标?
您遇到的问题是由于 Spring Boot 在测试期间处理属性源和配置文件的方式造成的。当您使用
AppConfig
注释您的 @TestPropertySource
类时,它不会影响使用此配置的测试类。这是因为 @TestPropertySource
和 @ActiveProfiles
旨在用于测试类,而不是配置类。
要让所有测试在包含
application-test.properties
时自动使用 AppConfig.class
,您需要在测试期间激活“测试”配置文件,而无需单独注释每个测试类。
在项目的测试资源目录 (
src/test/resources
) 中,创建一个 application.properties
文件(如果尚不存在)。
将以下行添加到
src/test/resources/application.properties
spring.profiles.active=测试
此行告诉 Spring Boot 在运行测试时激活“test”配置文件。结果,它将自动加载
application-test.properties
文件。
@TestPropertySource("/application-test.properties")
类中删除 AppConfig
注释,因为它在那里不起作用。由于我们已经在测试中设置了活动配置文件
application.properties
,因此您无需使用@TestPropertySource
或@ActiveProfiles
注释您的测试类。您的测试课程可以保留为:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AppConfig.class, TestService.class})
public class SpringTest {
@Autowired
private TestService testService;
@Value("${meta}")
private String value;
@Test
public void test() {
System.out.println(value); // Should print "value-test"
}
}