【发布时间】:2015-09-28 14:59:48
【问题描述】:
这肯定是一个普遍的问题。我有一个像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。
我能想到几个粗略的解决方案:
- 在每次测试之前,在文件系统上找到文件,使用文件系统 I/O 复制它,然后在测试后再次将其删除。但这很笨拙并且涉及大量冗余。更不用说我什至不确定类路径目录是否可写。
- 使用模拟框架模拟
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 重复,但事实并非如此。这个问题是关于希望在主调用和测试调用之间有一个不同的属性文件。对我来说,我希望在测试调用和另一个测试调用之间有一个不同的属性文件。
【问题讨论】:
-
这是一个非常好的问题。您是否频繁地获取
Properties对象以能够将其存根?即使有一百万种获取属性的方法,您的代码是否以统一的方式访问属性文件,这会消除您必须模拟的一些测试向量?或者它是一个黑盒子,你不知道? -
我的代码目前确实以统一的方式获取属性,但我不希望我的测试在未来因为有人更改了获取属性文件的方式而失败。不知道你所说的“存根”是什么意思。你的意思是模拟
Properties类的构造函数和load方法什么都不做,然后模拟getProperty方法只返回我在测试类中创建的映射的属性?这是个好主意……尽管验证我将正确的文件名传递给getResourceAsStream(等等)并没有帮助 -
是的,这就是我的提议,你说得对,这不是面向未来的。我觉得验证正确的文件名应该是一个不同的测试......
-
@ShotgunNinja 是的,它应该是一个不同的测试,但是怎么做呢?如果我基本上忽略了对
getResourceAsStream等的调用,则通过模拟Properties类本身。 -
@Cassian 我很难理解您的评论。 Java 属性只接受属性文件中的每个键的一个值,我的应用程序也是如此。我不认为我是在“测试是否从不同的文件中传递了一个变量”,尽管我也不太明白这意味着什么。
标签: java unit-testing junit properties mocking