gpt4 book ai didi

java - 如何在@Configuration中模拟用@PropertySource注入(inject)的.properties文件?

转载 作者:行者123 更新时间:2023-11-30 06:26:51 29 4
gpt4 key购买 nike

我的应用程序期望找到一个名为 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 是在我的项目的root 下创建的,这绝对不是我想要的。

我希望在我的 target 文件夹下创建 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.xmlsrc/test/resources/log4j2-test.xml),它起作用了:/

我可以对 Spring 使用 @PropertySource 注入(inject)的属性文件执行相同的操作吗?

最佳答案

您可以为此使用 @TestPropertySource 注释。

示例:对于单一属性(property):

@TestPropertySource(properties = "property.name=value")

对于属性文件

@TestPropertySource(
locations = "classpath:yourproperty.properties")

因此,您提供 MyPojo.json 的路径,例如

@TestPropertySource(properties = "path=build/cfg/MyPojo.json")

关于java - 如何在@Configuration中模拟用@PropertySource注入(inject)的.properties文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47020542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com