在单元测试期间填充弹簧@Value

2022-08-31 04:52:19

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

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

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

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

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


答案 1

如果可能的话,我会尝试在没有Spring Context的情况下编写这些测试。如果您在没有 spring 的测试中创建此类,则可以完全控制其字段。

要设置字段,您可以使用Springs ReflectionTestUtils - 它有一个方法setField来设置私有字段。@value

@see JavaDoc: ReflectionTestUtils.setField(java.lang.Object, java.lang.String, java.lang.Object)


答案 2

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

例如

@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();
    }

  }

}

注意:有必要在春季上下文中具有实例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);
  }

}

推荐