在Spring Boot测试中适当使用TestPropertyValues

时间:2019-02-16 01:24:35

标签: java spring-boot spring-boot-test

我碰到了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变量,用于将属性应用于属性,但是我找不到其他文档。

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

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

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

我了解可以为properties使用@SpringBootTest参数,该参数在创建bean之前更新环境,那么TestPropertyValues的合适用法是什么?

1 个答案:

答案 0 :(得分:0)

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)。如果您搜索代码库,则会发现很多其他有关其通常使用方式的示例。