我已经尝试了this stack overflow question,但我对maven有点失落。
在Maven项目中,我想测试一个最终在给定路径中写入文本文件的函数。我的函数的签名是boolean printToFile(String absolutePath)
(返回值是成功标志)
在src/test/resources
下我有我预期的档案;我们称之为expected.txt
。
使用apache.commons.commons-io
依赖关系:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
我想叫我的功能;创建两个File
个对象并比较它们的内容:
@Test
public void fileCreationTest() {
String outputPath = Thread.currentThread().getClass().getClassLoader().getResource("got.txt").getFile();
myTestedObject.printToFile(outputPath);
File got = new File(outputPath);
String expectedFilePath = Thread.currentThread().getClass().getClassLoader().getResource("expected.txt").getFile();
File expected = new File(expectedFilePath)
boolean areEqual = FileUtils.contentEquals(got, expected);
Assert.assertTrue(areEqual);
[EDITED]
这不是调用函数的问题:如果我从普通代码调用它,它确实可以工作但是如果我运行我的测试,它会失败(来自maven或来自我的IDE)。我认为这与测试性质有关。
答案 0 :(得分:4)
以下代码对我(在测试中或其他方面)没有意义:
String outputPath = Thread.currentThread().getClass().getClassLoader().getResource("got.txt").getFile();
myTestedObject.printToFile(outputPath);
File got = new File(outputPath);
问题是getResource
会将URL
返回到可能位于文件系统,JAR或其他位置的资源。并且getResource
必须存在才能返回非null
。这意味着你的测试需要覆盖它(它可能是不可写的)。
你可能应该做的是:
File got = File.createTempFile("got-", ".txt");
String outputPath = got.getAbsolutePath();
myTestedObject.printToFile(outputPath);
另外,对于expected
文件,我认为如果使用测试类的类加载器而不是上下文类加载器会更好。它也更具可读性:
String expectedFilePath = getClass().getClassLoader().getResource("expected.txt").getFile();
File expected = new File(expectedFilePath);
但是,您再次假设资源是从文件系统加载的。如果不是这样,它可能会破裂。你能比较两个InputStream
的字节吗?
最后,确保测试使用与预期文件相同的编码写入文件,并且换行符/回车符匹配。