【问题标题】:How should I discover test-resource files in a Maven-managed Java project?我应该如何在 Maven 管理的 Java 项目中发现测试资源文件?
【发布时间】:2011-07-25 12:55:36
【问题描述】:

我有一个使用普通 Maven 结构的项目,例如

module
\ src
  \ main
    - java
    - resources
  \ test
    - java
    - resources

等等。在test/resources 下,我想为我正在编写的解析器保留一组测试输入文件,然后通过测试套件运行目录中的所有文件。正如现在所写的那样,测试代码可以从命令行运行,但在通过 Eclipse JUnit 插件运行时会失败:

File file = new File("src/test/resources");
file.list();

(我实际上使用的是FilenameFilter,但我正在尝试简化。)

问题,在用调试器戳穿单元测试后,原来是我正在构建的文件指向/path/to/workspace/myproj/src/test/resources,而实际文件驻留在/path/to/workspace/myproj/modulename/src/test/resources(这是一个Maven多模块项目)。显然,从命令行运行mvn test 时这不是问题。

我想我的问题有两个:第一,我做错了吗?我看到很多人使用类加载器来发现资源,就像在this question 中一样,但我不想要所有资源 特定类型,只需要 test/resources 下的一个目录。第二,如果这不是一个糟糕的想法,我是否有配置错误(例如,它“应该”工作)?是 Eclipse 的错,还是 Maven 的问题,还是什么?

【问题讨论】:

    标签: java eclipse unit-testing resources maven


    【解决方案1】:

    一个技巧是将一个文件放在一个已知名称的资源中,通过类加载器获取该文件的 URI,然后从该 URI 构造一个 File,然后获取父目录,然后 list() 该目录的内容.有点 hack,但它应该可以工作。

    这就是代码的样子,但是在 test/src/resources 中放置一个名为 MY_TEST_FILE(或其他)的文件

    URL myTestURL = ClassLoader.getSystemResource("MY_TEST_FILE");
    File myFile = new File(myTestURL.toURI());
    File myTestDir = myFile.getParentFile();
    

    然后您就可以访问您要查找的目录了。

    也就是说,如果没有更“行家”的方式来做这件事,我会感到惊讶..

    【讨论】:

    • 我曾想过.... >
    • 只是提到在任何Java版本中都没有找到ClassLoader#getClassLoader方法。只需Class#getClassLoader
    • 感谢@XtremeBiker,已更改。我很困惑,这甚至得到了投票
    【解决方案2】:

    为了完整起见,我想指出无需使用ClassLoader#getSystemResource 获取ClassLoader 的当前实例的方法。此示例无需在顶部放置文件即可完成工作。

    //Obtains the folder of /src/test/resources
    URL url = ClassLoader.getSystemResource("");
    File folder = new File(url.toURI());
    //List contents...
    

    【讨论】:

      【解决方案3】:

      试试这个?

      1) 将测试数据文件放入与测试类相同的包结构中。也就是说,如果您在 src/test/java/com/fruits 中有一个名为 Apple 的测试类,那么您的测试数据文件将在 src/resources/java/com/fruits 中。

      2) 编译文件时,类和数据文件都应位于 target/test-classes/com/fruits 中。如果是这种情况,在您的代码中,您可以通过这种方式获取文件“this.getClass().getResourceAsStream("myFile")”

      【讨论】:

        【解决方案4】:
        1. 将所需资源放入/src/test/resources/lipsum.pdf
        2. 使用

          找到它的完整路径

          String fileName = ClassLoader.getSystemResource("lipsum.pdf").getFile();

        【讨论】:

        • 问题的重点是枚举给定目录中的文件,所以我不必每次添加新测试用例时都更新代码。跨度>
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        相关资源
        最近更新 更多