我的应用程序希望找到一个名为MyPojo.json的配置文件,该文件由MyService类加载到MyPojo类中:
@Data // (Lombok's) getters and setters
public class MyPojo {
int foo = 42;
int bar = 1337;
}
如果它不存在,这不是问题:在这种情况下,应用程序将使用默认值创建它。
读取/写入MyPojo.json的路径存储在
/src/main/resources/settings.properties
中:the.path=cfg/MyPojo.json
通过Spring的
@PropertySource
传递给MyService,如下所示:@Configuration
@PropertySource("classpath:settings.properties")
public class MyService {
@Inject
Environment settings; // "src/main/resources/settings.properties"
@Bean
public MyPojo load() throws Exception {
MyPojo pojo = null;
// "cfg/MyPojo.json"
Path path = Paths.get(settings.getProperty("the.path"));
if (Files.exists(confFile)){
pojo = new ObjectMapper().readValue(path.toFile(), MyPojo.class);
} else { // JSON file is missing, I create it.
pojo = new MyPojo();
Files.createDirectory(path.getParent()); // create "cfg/"
new ObjectMapper().writeValue(path.toFile(), pojo); // create "cfg/MyPojo.json"
}
return pojo;
}
}
由于MyPojo的路径是相对的,因此当我从单元测试中运行时
@Test
public void testCanRunMockProcesses() {
try (AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(MyService.class)){
MyPojo pojo = ctx.getBean(MyPojo.class);
String foo = pojo.getFoo();
...
// do assertion
}
}
cfg/MyPojo.json
是在项目的根目录下创建的,这绝对不是我想要的。我希望在目标文件夹下创建MyPojo.json。在Gradle项目中为
/build
,在Maven项目中为/target
。为此,我在src / test / resources下创建了一个辅助settings.properties,其中包含
the.path=build/cfg/MyPojo.json
并尝试以几种方式将其提供给MyService,但没有成功。
即使被测试用例调用,MyService始终读取
src/main/resources/settings.properties
而不是src/test/resources/settings.properties
。它使用两个
log4j2.xml
资源(src/main/resources/log4j2.xml
和src/test/resources/log4j2-test.xml
)代替:我可以用Spring用
@PropertySource
注入的属性文件来做同样的事情吗? 最佳答案
您可以为此使用@TestPropertySource批注。
例:
对于单一财产:
@TestPropertySource(properties = "property.name=value")
对于属性文件
@TestPropertySource(
locations = "classpath:yourproperty.properties")
因此,您可以为MyPojo.json提供路径,例如
@TestPropertySource(properties = "path=build/cfg/MyPojo.json")