java - 在 Spring Boot Tests 中正确使用 TestPropertyValues
问题描述
我遇到了TestPropertyValues
,这里的 Spring Boot 文档中简要提到了这一点:https ://github.com/spring-projects/spring-boot/blob/2.1.x/spring-boot-project/spring-boot-docs/src /main/asciidoc/spring-boot-features.adoc#testpropertyvalues
此处的迁移指南中也提到了它:https ://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#environmenttestutils
这两个示例都显示了environment
将属性应用到的变量,但我找不到其他文档。
在我的测试中,属性设置来不及影响@Value
Spring Bean 的属性注入(通过)。换句话说,我有一个这样的构造函数:
public PhoneNumberAuthorizer(@Value("${KNOWN_PHONE_NUMBER}") String knownRawPhoneNumber) {
this.knownRawPhoneNumber = knownRawPhoneNumber;
}
由于上述构造函数在测试代码有机会运行之前被调用,因此在构造函数中TestPropertyValues
使用之前无法更改测试中的属性。
我知道我可以使用properties
参数 for @SpringBootTest
,它会在创建 bean 之前更新环境,那么合适的用法是TestPropertyValues
什么?
解决方案
TestPropertyValues
并没有真正考虑到设计@SpringBootTest
。当您编写手动创建ApplicationContext
. 如果你真的想用它@SpringBootTest
,应该可以通过一个ApplicationContextInitializer
. 像这样的东西:
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = PropertyTest.MyPropertyInitializer.class)
public class PropertyTest {
@Autowired
private ApplicationContext context;
@Test
public void test() {
assertThat(this.context.getEnvironment().getProperty("foo")).isEqualTo("bar");
}
static class MyPropertyInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertyValues.of("foo=bar").applyTo(applicationContext);
}
}
}
Spring Boot 自己的测试用的TestPropertyValues
比较多。例如,applyToSystemProperties
当您需要设置系统属性并且不希望它们在测试完成后被意外留下时非常有用(参见EnvironmentEndpointTests示例)。如果你搜索代码库,你会发现很多其他的例子,说明它通常被使用的方式。
推荐阅读
- r - Shiny App 在 Rstudio 上工作,但不在服务器上
- kendo-ui - 将 2013 剑道 MVC 升级到 2018 剑道 MVC。要下载什么版本?
- mysql - 如何比较 MySQL 中格式为 dd.mm.yyyy 的日期(varchar)?
- vb.net - 用于选择的 LINQ to SQL 可变列数
- java - com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.root.minimt.HomeworkModel 类型
- vue.js - 如何使用表格将输入数据从一页传输到另一页?
- ios - iOS 9 及更高版本(如 iOS 6)上的 Tableview 单元格
- c - `(void) a;` 的目的是什么?
- c - Ansi C:高流量控制/仅用*星*替换第一次出现并删除每个重复项
- vba - 浏览用户表单的函数或过程