java - 我如何模拟类路径中属性文件的存在?

标签 java unit-testing junit properties mocking

这肯定是一个普遍的问题。我有一个类似 my-settings.properties 的属性文件,它由应用程序类读取。当我编写测试类时,它需要测试可能出现在 my-settings.properties 中的不同场景,以确保最大的代码覆盖率(例如空属性文件、基本属性文件等) .但是我的 src/test/resources 中只能有一个 my-settings.properties

要是有注释就好了

@MockFileOnClassPath(use = "my-settings-basic.properties", insteadOf = "my-settings.properties")

然后我可以在我的 /src/test/resources 中有多个 my-settings-XXX.properties 文件,并在每个测试方法上注释正确的文件。但我找不到这样的东西。我正在使用 JUnit 4.12。

我可以想到几个粗略的解决方案:

  1. 每次测试前,在文件系统上找到文件,使用文件系统 I/O 复制它,然后在测试后再次删除它。但这是笨拙的并且涉及很多冗余。更不用说我什至不确定类路径目录是否可写。
  2. 使用模拟框架模拟getResource。不知道我该怎么做,尤其是因为有一百万种不同的方法来获取文件(this.getClass().getResourceAsStream(...), MyClass.class.getResourceAsStream (...), ClassLoader.getSystemClassLoader().getResourceAsStream(...) 等)

我只是认为这一定是一个常见问题,也许在 JUnit、Mockito、PowerMock、EasyMock 或类似的东西中已经有解决方案?

编辑:有人指定此问题与Specifying a custom log4j.properties file for all of JUnit tests run from Eclipse 重复但事实并非如此。这个问题是关于想要在主调用和测试调用之间有一个不同的属性文件。对我来说,我想在测试调用和另一个测试调用之间有一个不同的属性文件。

最佳答案

我发现在处理文件时,最好引入Resource的概念。

例如:

public interface Resource {
    String getName();
    InputStream getStream();
}

然后你可以通过依赖注入(inject)传递资源:

public class MyService {
    private final Properties properties;

    public class MyService(Resource propFile) {
        this.properties = new Properties();
        this.properties.load(propFile.getStream());
    }

    ...
}

然后,在您的生产代码中,您可以使用 ClasspathResourceFileResourceURLResource 等,但在您的测试中,您可以使用StringResource

请注意,如果您使用 spring,那么您已经实现了这个概念。更多详情 here

关于java - 我如何模拟类路径中属性文件的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826119/

相关文章:

gradle - 在assertj中输出预期列表和实际列表之间的完整差异

python - 在不运行 __init__ 的情况下测试实例方法的最佳方法

ios - XCTAssertEqual 用于 Swift 中的自定义对象

javascript - jest.doMock 和 JSON 导入模拟

java - 每次运行 Junit 测试时实体管理器都为空

java - 修改 void 函数的输入参数,然后读取

java - 如何从规划实体使用OptaPlanner ValueRange?

java - 用@Immutable 注释一个不可变的Java 类有什么好处?

java - firebase 检查子进程是否存在

java - 在 docker 中运行 spring boot webapp 时,我应该使用 "-server"java 标志吗?