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

pet*_*erp 16 migration unit-testing maven java-platform-module-system java-9

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

该项目已在标准的Maven目录结构进行布局,即具有src/main/java,src/test/java等等.

当我添加module-info.javasrc/main/java,Maven的编译器插件无法抛出一个NullPointerException.这是因为它希望找到test目录的模块信息.所以,据我所知,选项是:

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

显然,这些选项似乎都不合适,所以我假设有一种在Maven项目中测试Jigsaw模块的推荐方法.不幸的是,我既没有找到建议也没有例子.

编辑:在发布问题时添加一些我不相关的信息(对不起)

Nic*_*lai 10

Maven对Java 9的支持,特别是对测试的支持仍在开发中 - 许多工作都有效,但有些可能没有.没有看到NPE的堆栈跟踪,当然是推测,但我认为你遇到了这个错误.

更一般地说,即使在Jigsaw邮件列表上,仍在讨论单元测试与Jigsaw如何一致的问题.

以下是我对此事的看法:

  1. 如您所知,将测试放入单独的模块意味着只有导出包中的公共类型才是可测试的,这绝对是不够的.有可能是解决方法,但这些要求对可以编辑模块声明(源代码; module-info.java)或描述符(字节代码,module-info.class在运行中),或添加一吨的--add-exports命令行标志到javacjava编译和运行测试的命令.这些听起来都不是特别有趣,特别是如果你想亲手做的话.

  2. 将测试移动到源树中也是一个坏主意,原因很明显,尤其是在没有测试的情况下创建JAR需要大量的小工具.

  3. 另一种选择是使用--patch-module允许将class-files或JAR内容添加到现有模块的选项.这样,该testCompile步骤可以创建包含源文件测试文件的JAR .遗憾的是,除非它如上所述操纵模块声明/描述,否则如果不java --add-reads为测试依赖项添加读取边缘,则无法执行生成的JAR .仍然,比上面更好.

  4. 作为一种最后的手段,有一些方法可以将生产JAR视为常规JAR而不是模块.最简单的可能是将它与测试JAR一起转储到类路径上.这样一切都像Java <9一样工作.不幸的是,这将破坏使用特征的代码,假设它在命名模块中(例如,与反射API的某些类型的交互).

就个人而言,我认为3.是上述选项中最好的.它不需要改变项目布局,只需要相对较少的添加javacjava命令.

  • 很高兴我能帮助你.务必报告回来,不论是在这里,发帖还是邮寄给jigsaw-dev.此时,基于实际实验的所有反馈都是有价值的. (2认同)

Rob*_*lte 6

您必须至少使用maven-compiler-plugin 3.6.0来获得拼图支持.但是,由于构建+148类文件的二进制结构已更改,因此插件无法像以前一样提取模块名(模块名需要能够编译测试).我正在努力解决这个问题,但我可能依赖于新版本的ASM.

更新:maven-compiler-plugin-3.6.1已经发布,因此恢复了对jigsaw的支持.

  • 仅供参考:http://maven.apache.org/plugins/maven-compiler-plugin/xref/org/apache/maven/plugin/compiler/TestCompilerMojo.html#L259向您展示maven-compiler-plugin正在使用解决方案3 @Nicolai已经被拼图团队的一些开发人员验证为正确的方法 (2认同)
  • 最简单的解决方案是使用JDK9之前的148版本.如果要修补插件,getModuleName()应该返回`src/main/java/module-info.java`中定义的模块名称.我选择提取值,否则你必须在module-info文件和pom.xml中指定它作为maven-compiler-plugin的配置. (2认同)