【问题标题】:Maven Unit Test FileNotFound ErrorMaven 单元测试 FileNotFound 错误
【发布时间】:2012-01-30 22:01:03
【问题描述】:

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

我创建了一个测试类来生成“mock/test”报告文件,但是在运行我的单元测试时,当使用“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 很陌生。非常感谢任何反馈!

【问题讨论】:

  • 能否把相关代码sn-p-writeToADelimitedFile方法贴在FileWriterObject中?看起来 maven 无法创建文件

标签: java unit-testing maven fileoutputstream


【解决方案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", ".")

【讨论】:

  • 为了环境独立,也应该可以使用标准的java属性user.dir
  • 这对我没有帮助,因为部署的应用程序将没有“目标”子目录。这就是为什么我在部署的服务器上没有收到此错误的原因。只有当我尝试运行测试以在本地或通过构建服务器上的“mvn test”写入相应的文件时。
  • @Rick 对不起,它没有帮助。我想我对您的要求感到困惑。
  • @BenjaminLinus 不用担心。也许其他人也是如此。在生产中,文件的“写入”工作得很好。但是,当我运行“mvn 测试”时,它似乎无法写入/创建新文件。这发生在我的本地机器和我们的 Hudson 构建服务器上。
【解决方案2】:

看起来我不能告诉 Maven 相对于一个目录运行它的测试,除了我运行命令“mvn test”的那个目录。

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

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

我希望我能告诉 maven,即“mvn -Dbase.dir=target test”,但显然我不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多