当前位置: 首页 > 知识库问答 >
问题:

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

施彦
2023-03-14

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

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

只要我添加模块信息。javasrc/main/java,maven编译器插件无法抛出NullPointerException。这是因为它也希望找到测试目录的模块信息。因此,据我所知,有以下几种选择:

  • 将测试类保留在单独的模块中,这意味着它们只能访问主模块的导出包

显然,这两个选项似乎都不可取,所以我假设有一个推荐的方法来测试Maven项目中的拼图模块。不幸的是,我既找不到建议也找不到例子。

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

  • 我遇到的NullPointerException
  • Maven 3.3.9
  • maven编译器插件3.6.0
  • 源和目标配置:9

共有3个答案

扈德容
2023-03-14

如前所述,使用更新版本的maven编译器插件: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>

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

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

mvn test
厍彭薄
2023-03-14

您必须至少使用maven-compiler-plugin 3.6.0来支持拼图。然而,自从构建148以来,类文件的二进制结构已经改变,所以插件不能像以前一样提取模数名(模数名是编译测试所必需的)。我正在对此进行修复,但我可能依赖于新版本的ASM。

更新:maven-compiler-plugin-3.6.1已经发布,所以对jigsaw的支持已经恢复。

祁默
2023-03-14

Maven对Java9的总体支持,特别是对测试的支持仍在开发中——许多东西可以工作,但其他东西可能不行。没有看到NPE的堆栈跟踪,这当然是猜测,但我假设您遇到了这个错误。

更一般地说,单元测试将如何与Jigsaw协同工作的问题仍在讨论中,甚至在Jigsaw邮件列表上也是如此。

以下是我对此事的看法:

>

  • 正如您所注意到的,将测试放入一个单独的模块中意味着只有导出包中的公共类型是可测试的,这肯定是不够的。可以有一些变通方法,但是需要在运行中编辑模块声明(源代码;module-info.java)或描述符(byte code,module-info.class),或者在编译和运行测试的javacjava命令中添加大量的--add-export命令行标志。这些听起来都不是特别有趣,尤其是如果您想手工操作的话。

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

    另一个选项是使用--补丁模块选项,该选项允许向现有模块添加--文件或JAR的内容。这样,testCompile步骤就可以创建一个包含源文件和测试文件的JAR。不幸的是,除非它像上面描述的那样操纵模块声明/描述,否则如果不为测试依赖项添加java--add reads,就无法执行生成的JAR。不过,还是比上面好。

    作为一种最后手段,有一些方法可以让生产JAR像普通JAR一样对待,而不是像模块一样对待。最简单的方法可能是将其与测试JAR一起转储到类路径上。这样一来,一切都和Java中的一样

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

  •  类似资料:
    • 问题内容: 关于组织单元测试,我有两个问题。 我是否必须将测试放在与测试类相同的程序包中,或者可以在不同程序包中组织测试? 例如,如果我具有 有效性 和 其他 测试,即使它们属于同一班级,将它们分成不同的包是否正确? 模拟和存根类呢?我应该将它们与仅包含测试的软件包分开,还是放在一起? 问题答案: 我们执行JUnit测试用例的方法是将它们放在相同的包中,但放在不同的根目录中。由于我们使用Maven

    • 以下是在不使用聚合物的情况下运行良好的测试代码: 但我希望在聚合物元素中使用Javascript,并尝试了以下插入: NR 1:脚本标记内的Javascript,模板标记后的Javascript: 我想这意味着,编译器看不到按钮id,因为它在阴影中? 请指示我。

    • 问题内容: 我使用netfishs 6.7.1和glassfish v2.1编写了一个Web服务项目,将log4j.properties放入项目的根目录并使用: 在构造函数中: 在功能上: 但是,这是错误信息(实际上,我已经尝试将它几乎可以实现的每个目录都放入): 问题答案: 我知道回答这个问题有点晚了,也许您已经找到了解决方案,但是我将发布我找到的解决方案(在我进行大量Google搜索之后),因

    • 在Vaadin 10-14中,我应该将静态文件放在哪里,例如CSS、JavaScript和聚合模板?静态文件(如图像)如何? 此外,如何在Vaadin中导入这些文件?Vaadin 14与npm和Vaadin 10-13与bower之间有差异吗?

    • Django1.7引入了数据库迁移。 我知道忽略迁移可能是一个不好的做法,因为这部分代码将不会被测试。但事实并非如此:我在CI测试服务器(jenkins)中运行完整的迁移。我只想跳过本地测试中的迁移,因为速度很重要。 一些背景: 在Django1.6之前,在使用South时,我一直使用SOUTH_TESTS_MIGRATE设置: 可以使用--keepDB选项在测试运行之间保留测试数据库。这样做的好

    • 问题内容: 我应该将Maven 2项目放在哪里,以便将Maven放在目标EAR工件中? 问题答案: 本应打包在最终EAR的目录下(旁标准)。 使用Maven EAR插件, 额外文件要包含在EAR中 的默认位置(可以使用参数控制)是。因此,以下操作将起作用(使用默认值):