首页 > 解决方案 > 在 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将属性应用到的变量,但我找不到其他文档。

在我的测试中,属性设置来不及影响@ValueSpring Bean 的属性注入(通过)。换句话说,我有一个这样的构造函数:

  public PhoneNumberAuthorizer(@Value("${KNOWN_PHONE_NUMBER}") String knownRawPhoneNumber) {
    this.knownRawPhoneNumber = knownRawPhoneNumber;
  }

由于上述构造函数在测试代码有机会运行之前被调用,因此在构造函数中TestPropertyValues使用之前无法更改测试中的属性。

我知道我可以使用properties参数 for @SpringBootTest,它会在创建 bean 之前更新环境,那么合适的用法是TestPropertyValues什么?

标签: javaspring-bootspring-boot-test

解决方案


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示例)。如果你搜索代码库,你会发现很多其他的例子,说明它通常被使用的方式。


推荐阅读