如何覆盖Spring中@Value注入的字段值?

时间:2015-10-27 09:35:28

标签: java spring junit dependency-injection integration-testing

我有一个类使用@Value从属性注入一个字段:

public class MyClass {
    @Value(${property.key})
    private String filePath;
    ...

我的集成测试需要将filePath更改为指向某些不同的文件。

我尝试在调用方法之前使用反射来设置它:

public class MyClassIT {
    @Autowired MyClass myClass;

    @Test
    public void testMyClassWithTestFile1 {
        ReflectionTestUtils.setField(myClass, "filePath", "/tests/testfile1.csv");
        myClass.invokeMethod1();
        ...

但是当调用第一个方法时,@Value注入将启动并更改刚刚设置的值。任何人都可以建议如何解决这个或另一种方法?

注意:我需要Spring来管理类(因此会注入其他依赖项),并且使用不同的测试文件需要对同一个类进行其他测试。

2 个答案:

答案 0 :(得分:3)

只需使用二传手。无论如何,通常优选使用二次注射而不是场注射。更好的是,完全转换为构造函数和setter注入,通常可以用模拟替换Spring测试上下文。

答案 1 :(得分:2)

尝试spring profiling

您可以切换dev,prod,集成环境的配置文件

    var obj = {
      "key": "undefined"
    };

    obj["key"] = "value";
     // I want this to be save

    var a = document.createElement("a");
    a.download = "hi.json";
    a.href = "data:application/json;charset=utf-8," + JSON.stringify(obj);
    document.body.appendChild(a);
    a.click();

比测试使用@Configuration public class AppConfiguration { @Value("${prop.name}") private String prop; @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } @Configuration @Profile("dev") @PropertySource("classpath:dev.properties") public static class DevAppConfig { } @Configuration @Profile("test") @PropertySource("classpath:test.properties") public static class TestAppConfig { } }