我有一个类使用@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来管理类(因此会注入其他依赖项),并且使用不同的测试文件需要对同一个类进行其他测试。
答案 0 :(得分:3)
只需使用二传手。无论如何,通常优选使用二次注射而不是场注射。更好的是,完全转换为构造函数和setter注入,通常可以用模拟替换Spring测试上下文。
答案 1 :(得分:2)
您可以切换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 {
}
}