Maven单元测试FileNotFound错误

时间:2012-01-30 22:01:03

标签: java unit-testing maven fileoutputstream

我创建了一个Maven项目,该项目涉及在完成时“写出”CSV文件。

我创建了一个测试类来生成“模拟/测试”报告文件,但是在运行我的单元测试时,使用“mvn package”或“mvn test”命令时,我收到此错误:

28 Jan 2012 11:17:51,499 main DEBUG main.executors.ReportsExecutor:111  - Finished processing documents in 0.0 hours
28 Jan 2012 11:17:51,516 main ERROR main.utilities.FileWriterObject:279  - writeToADelimitedFile: reports/reportResults_1_28_2012_11.17.515.csv (No such file or directory) APPEND VALUE: false
28 Jan 2012 11:17:51,517 main ERROR main.executors.ReportsExecutor:170  - java.io.FileNotFoundException: reports/reportResults_1_28_2012_11.17.515.csv (No such file or directory)
java.io.FileNotFoundException: reports/reportResults_1_28_2012_11.17.515.csv (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
    at java.io.FileWriter.<init>(FileWriter.java:61)
    at 

请记住,“APPEND VALUE:false”输出只是一个调试语句,让我知道FileWriter构造函数中的“append”布尔参数为false,以便“创建”具有相应文件的新文件名。

现在,在生产中,它运作得很好。这只是我的单元测试不起作用。是否有一些我没有配置的“根测试”目录?

我对Maven非常环保。非常感谢任何反馈!

2 个答案:

答案 0 :(得分:1)

Maven设置了一个名为“basedir”的属性,便于在单元测试中使用。我写了一个快速单元测试,这对我来说都适用于maven和Eclipse:

public class ReadAndWriteToTargetDirectoryTest extends Assert {

    public static final String TEST_STRING = "Testing";

    @Test
    public void testReadWrite() {
        File file = new File(System.getProperty("basedir", ".") + File.separator + "target", "mavenTest.txt");

        try {
            FileWriter writer = new FileWriter(file);
            System.out.println("File: " + file.getCanonicalPath());
            writer.write(TEST_STRING);
            writer.close();

            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = reader.readLine();
            reader.close();
            assertTrue(line.equals(TEST_STRING));
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }
}

使用System.getProperty(...)获取“basedir”系统属性时,请务必将默认参数设置为“。”这样你就可以在Eclipse中运行单元测试了:

System.getProperty("basedir", ".")

答案 1 :(得分:0)

看起来我无法告诉Maven将其测试“相对”地运行到一个目录,而不是我运行命令“mvn test”的那个。

因此,如果我正在尝试写入项目根目录“相对”的目录中的文件,我需要拥有我的Java类,即执行写入的那个,检查以确保相应的目录存在之前写它。

我最初没有这样做的原因是因为我的ant-deployment.xml文件构建了我实现所需的目录,即目标/日志,目标/资源等。所以当我运行时我部署的应用程序,我没有这个问题。

我希望我能告诉maven,即“mvn -Dbase.dir =目标测试”,但显然我不能。