如何在@Configuration中模拟用@PropertySource注入的.properties文件?

时间:2017-10-30 16:59:03

标签: java spring unit-testing junit mocking

我的应用程序希望找到一个名为 MyPojo.json 的配置文件,通过 MyService 类加载到 MyPojo 类:< / p>

@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 下创建的,这绝对不是我想要的。

我希望在 目标 文件夹下创建 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注入的属性文件执行相同的操作?

1 个答案:

答案 0 :(得分:1)

您可以使用 @TestPropertySource 注释。

实施例: 对于单一财产:

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

对于属性文件

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

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

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