在资源文件夹下的JUnit测试中写入文件

时间:2015-04-27 14:31:30

标签: java maven junit io

我已经尝试了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)。我认为这与测试性质有关。

1 个答案:

答案 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的字节吗?

最后,确保测试使用与预期文件相同的编码写入文件,并且换行符/回车符匹配。