首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Java 8项目迁移到Jigsaw时,我应该将单元测试放在哪里?

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

Stack Overflow用户
提问于 2016-12-28 17:04:31
回答 3查看 2.2K关注 0票数 16

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

该项目已在标准Maven目录布局中进行布局,即具有src/main/javasrc/test/java等。

一旦我将module-info.java添加到src/main/java中,maven编译器插件就会抛出一个NullPointerException。这是因为它也希望为test目录找到一个模块信息。因此,据我所知,选择如下:

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

显然,这两个选项似乎都是可取的,因此我假设在Maven项目中有一种测试Jigsaw模块的推荐方法。不巧的是,我既找不到建议,也找不到例子。

编辑:添加一些我认为与问题无关的信息(对不起)

EN

回答 3

Stack Overflow用户

发布于 2016-12-28 18:33:47

Maven一般对Java 9的支持,特别是对测试的支持仍在开发中--很多东西都能工作,但其他的可能不行。没有看到NPE的堆栈跟踪,这当然是推测,但我假设您是遇到这个错误

更普遍的是,单元测试将如何与Jigsaw一起工作的问题仍在讨论中--甚至是在拼图邮件列表上

以下是我对这件事的看法:

  1. 正如您注意到的,将测试放在单独的模块中意味着只有导出包中的公共类型才是可测试的,这肯定是不够的。可能有一些解决办法,但这些方法需要动态编辑模块声明(源代码;module-info.java)或描述符(字节代码,module-info.class),或者在编译和运行测试的javacjava命令中添加大量--add-exports命令行标志。这些听起来没有什么特别有趣的,尤其是如果你想用手做的话。
  2. 将测试迁移到源树也是个坏主意,原因很明显,尤其是在没有测试的情况下创建JAR需要大量修改。
  3. 另一个选项是使用--patch-module选项,该选项允许向现有模块中添加class-files或JAR内容。这样,testCompile步骤就可以创建一个包含源文件和测试文件的JAR。不幸的是,除非像上面所描述的那样操纵模块声明/描述,否则如果不为测试依赖项添加带有java --add-reads的读边,就无法执行得到的JAR。不过,比上面好多了。
  4. 作为一种最后的手段,有一些方法可以将生产罐当作一个常规的罐子,而不是一个模块。最简单的方法可能是将其与测试JAR一起转储到类路径中。不幸的是,这会破坏使用特性的代码,假设它在指定的模块中(例如,与反射API的某种交互)。

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

票数 10
EN

Stack Overflow用户

发布于 2016-12-28 22:43:03

您至少必须使用maven编译器-plugin3.6.0来支持拼图。但是,由于build +148类文件的二进制结构发生了变化,所以插件无法像以前那样提取模块名(需要模块名才能编译测试)。我正在努力解决这个问题,但我可能依赖于ASM的一个新版本。

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

票数 6
EN

Stack Overflow用户

发布于 2017-10-12 04:39:32

建议在这里一样,使用maven编译器的更新版本-plugin:3.7.0将帮助您修复以下问题:-

代码语言:javascript
复制
<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>

在其中,您可以将单元测试放在与模块化之前相同的目录下。这是来自我的样本工程,它是基于JDK9和Maven3+的。该项目遵循屏幕截图中描述的目录结构:-

然后发布这段代码,只需使用以下命令执行测试:

代码语言:javascript
复制
mvn test

在项目的根目录中,查找测试将像往常一样执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41366582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档