在单元测试期间填充 Spring @Value

新手上路,请多包涵

我正在尝试为我的程序中用于验证表单的简单 bean 编写单元测试。 bean 用 @Component 注释,并有一个使用初始化的类变量

@Value("${this.property.value}") private String thisProperty;

我想为此类中的验证方法编写单元测试,但是,如果可能的话,我想在不使用属性文件的情况下这样做。我的理由是,如果我从属性文件中提取的值发生变化,我希望这不会影响我的测试用例。我的测试用例是测试验证值的代码,而不是值本身。

有没有办法在我的测试类中使用 Java 代码来初始化 Java 类并填充该类中的 Spring @Value 属性,然后使用它进行测试?

我确实发现这个 How To 似乎很接近,但仍然使用属性文件。我宁愿这一切都是Java代码。

原文由 Kyle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

从 Spring 4.1 开始,您可以通过在单元测试类级别使用 org.springframework.test.context.TestPropertySource 批注在代码中设置属性值。您甚至可以使用这种方法将属性注入到依赖的 bean 实例中

例如

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }

  @Configuration
  static class Config {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }

  }

}

注意: 在 Spring 上下文中必须有 org.springframework.context.support.PropertySourcesPlaceholderConfigurer 的实例

编辑 24-08-2017: 如果您使用的是 SpringBoot 1.4.0 及更高版本,则可以使用 @SpringBootTest@SpringBootConfiguration 注释初始化测试。更多信息 在这里

对于 SpringBoot,我们有以下代码

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }

}

原文由 Dmytro Boichenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题