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

时间:2016-12-28 17:04:31

标签: maven unit-testing migration java-9 jigsaw

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

该项目已在标准Maven目录布局中布局,即具有<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rSIt> <sType> <code>VI</code> <description>V Inc</description> <name>S_V_INC</name> </sType> <bits/> <mHave>true</mHave> </rSIt> src/main/java等。

只要将src/test/java添加到module-info.java,maven-compiler-plugin就会失败,抛出NullPointerException。这是因为它期望找到src/main/java目录的模块信息。所以,据我所知,选项是:

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

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

编辑:在发布问题时添加一些我认为不相关的信息(抱歉)

3 个答案:

答案 0 :(得分:10)

Maven对Java 9的支持,特别是测试仍在开发中 - 很多东西都有用,但有些可能没有。没有看到NPE的堆栈跟踪,当然是推测,但我假设你ran into this error

更一般地说,关于单元测试如何与Jigsaw一起使用的问题仍在讨论中 - 甚至是on the Jigsaw mailing list

以下是我对此事的看法:

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

  2. 将测试移到源代码树中也是一个坏主意,原因很明显,尤其是在没有测试的情况下创建JAR会需要大量的调整。

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

已经suggested here,使用maven-compiler-plugin的更新版本:3.7.0将帮助您解决此问题: -

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
            <source>9</source>
            <target>9</target>
            <compilerArgument>-Xlint:all</compilerArgument>
        </configuration>
     </plugin>
</plugins>

在哪里可以将您的单元测试放在模块化之前的同一目录下。这是我的sample project,它基于JDK9和Maven3 +。该项目遵循屏幕截图中所示的目录结构: -

enter image description here

发布这个你需要做的就是使用命令执行测试:

mvn test

从项目的根目录中查找测试将照常执行。