maven - 将 Java 8 项目迁移到 Jigsaw 时我应该在哪里放置单元测试

标签 maven unit-testing migration java-9 java-platform-module-system

我目前正在测试使用 jdk-9+149 将 Java 8 应用程序迁移到 Java 9/Jigsaw。

该项目采用标准 Maven 目录布局,即具有 src/main/java , src/test/java , ETC。

只要我添加 module-info.javasrc/main/java , maven-compiler-plugin 无法抛出 NullPointerException。这是因为它希望找到 test 的模块信息。目录也是。所以,据我所知,选项是:

  • 将测试类保存在单独的模块中,这意味着它们只能访问主模块的导出包。
  • 将测试类连同源一起移动到主模块中,这意味着主模块需要测试依赖项。

  • 显然,这些选项似乎都不是可取的,所以我认为有一种推荐的方法可以在 Maven 项目中测试 Jigsaw 模块。不幸的是,我既找不到建议也找不到例子。

    编辑:添加一些我在发布问题时不认为相关的信息(对不起)
  • the NullPointerException I ran into
  • Maven 3.3.9
  • maven-compiler-plugin 3.6.0
  • 源和目标配置:9
  • 最佳答案

    Maven 对 Java 9 的总体支持,特别是对测试的支持仍在开发中 - 很多东西可以工作,但其他的可能不行。没有看到 NPE 的堆栈跟踪,这当然是猜测,但我假设你是 ran into this error .

    更一般地说,单元测试如何与 Jigsaw 一起工作的问题仍在讨论中 - 甚至 on the Jigsaw mailing list .

    以下是我对此事的看法:

  • 正如您所注意到的,将测试放入单独的模块意味着只有导出包中的公共(public)类型是可测试的,这绝对是不够的。可能有一些变通方法,但需要动态编辑模块声明(源代码;module-info.java)或描述符(字节码,module-info.class)或添加大量 --add-exports javac 的命令行标志和 java命令编译和运行测试。这些听起来都不是特别有趣,尤其是如果您想手动完成。
  • 出于显而易见的原因,将测试移到源代码树中也是一个坏主意,尤其是其中创建一个没有测试的 JAR 需要大量的摆弄。
  • 另一种选择是使用 --patch-module允许添加 class 的选项-files 或 JAR 的内容到现有模块。这样 testCompile step 可以创建一个包含源文件和测试文件的 JAR。不幸的是,除非它如上所述操作模块声明/描述,否则如果不使用 java --add-reads 添加读取边,则无法执行生成的 JAR。用于测试依赖项。不过还是比上面的好。
  • 作为一种最后的手段,有一些方法可以将生产 JAR 视为常规 JAR 而不是模块。最简单的可能是将它与测试 JAR 一起转储到类路径中。这样,一切都像在 Java <9 中一样工作。不幸的是,这将破坏使用功能的代码,假设它位于命名模块内(例如,与反射 API 的某些类型的交互)。

  • 就个人而言,我认为 3. 是上述选项中最好的。它不需要更改项目布局,只需对 javac 进行相对较小的添加。和 java命令。

    关于maven - 将 Java 8 项目迁移到 Jigsaw 时我应该在哪里放置单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366582/

    相关文章:

    c# - SpecFlow - 如何在具有自定义类型的实体上设置测试数据

    tomcat - 将tomcat7迁移到tomcat9后无法找到taglib

    mysql - Laravel 一对多(逆)/属于返回 null

    java - 如何检查 jar 文件依赖性

    java - 如何解决 Tomcat 8/Library/Tomcat/work/Catalina/localhost 目录中缺少的 servlet 类?

    java - Maven 在错误的存储库中搜索 Artifact

    windows - 对检查互联网连接的模块进行单元测试

    Maven 从错误的位置读取用户配置

    python - python 项目的 sonarqube 没有显示任何测试覆盖率

    php - Laravel 迁移不会在数据库中添加表