考虑以下示例:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties = {
"some.property=valueA"
})
public class ServiceTest {
@Test
public void testA() { ... }
@Test
public void testB() { ... }
@Test
public void testC() { ... }
}
我正在使用SpringBootTest
注释的properties
属性为此测试套件中的所有测试设置some.property
属性的值。现在,我想为其中一个测试设置此属性的另一个值(假设为testC
)而不影响其他测试。我怎样才能做到这一点?我已经阅读了"Testing" chapter of Spring Boot docs,但我找不到任何与我的用例匹配的内容。
答案 0 :(得分:4)
在Spring上下文加载期间,Spring会评估您的属性 所以你不能在容器启动后更改它们。
作为解决方法,您可以将方法拆分为多个类,以便创建自己的Spring上下文。 但请注意,因为测试执行应该很快,这可能是一个坏主意。
更好的方法是在被测试的类中设置一个setter
some.property
值并在测试中使用此方法以编程方式更改值。
private String someProperty;
@Value("${some.property}")
public void setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
答案 1 :(得分:0)
如果您正在使用@ConfigurationProperties
,则是另一种解决方案:
@Test
void do_stuff(@Autowired MyProperties properties){
properties.setSomething(...);
...
}
答案 2 :(得分:0)
更新
可以在Spring 5.2.5和Spring Boot 2.2.6中使用
@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
registry.add("some.property", () -> "valueA");
}