将 JUnit 5 与 Java 9 结合使用,不带 Maven 或 Gradle

2022-09-04 04:04:56

描述:

我想在Eclipse(Oxygen 4.7.1a)中使用JUnit 5创建一个JUnit测试。此 JUnit 测试应位于名为 Test 的单独 src 文件夹中。但是,由于我是JUnit和Java 9的新手,因此我遇到了以下问题。

我不想为此使用像Gradle或Maven这样的构建工具。

问题:

因为我有两个不同的src文件夹,一个用于项目src,一个用于测试用例:

  • 我需要两个模块信息.java文件吗?(每个 src 文件夹一个)
  • JUnit 5 需要哪些模块才能.java模块信息文件?

答案 1

一般来说,没有必要模块化你的测试代码(至少我想不出一个有效的理由,也许有人可以给出一个令人满意的反例)。只有一个文件可以(毕竟,甚至不需要模块化主代码)出现在主代码中。module-info.javasrc

由于该文件将仅位于主源目录中,而不在测试源目录中,因此从逻辑上讲,它不应依赖于 JUnit 模块。因此,现在的问题变成了如何通过依赖模块(表示被测系统)和JUnit模块来编译和运行JUnit测试类。module-info.java

为此,您需要使用javac和java提供的新选项

因此,假设您有以下树:

src
    module-info.java (declares a module called "my.module")
    mypackage
        MyClass.java
test_src
    mypackage
        MyClassTest.java
lib/junit-platform-console-standalone.jar

(注意:特别是对于 JUnit 5,您可以使用包含核心 JUnit 引擎并允许在控制台中运行测试的 junit-platform-console-standalone 工件;请参阅用户指南)

然后你可以编译代码,如下所示:

cd root_dir
javac -d mods/my.module src/module-info.java src/mypackage/MyClass.java

cd test_src
javac -d test_out --module-path ../mods;../lib/junit-platform-console-standalone.jar \
--add-modules org.junit.platform.console.standalone,my.module --patch-module my.module=. \
--add-reads my.module=org.junit.platform.console.standalone mypackage/MyClass.java

,您可以运行编译的测试类:

cd test_src/test_out
java --module-path=../../mods;../../lib/junit-platform-console-standalone.jar \
--add-modules my.module,org.junit.platform.console.standalone \
--add-reads my.module=org.junit.platform.console.standalone \
--patch-module my.module=. \
--add-opens my.module/test=org.junit.platform.console.standalone \ 
org.junit.platform.console.ConsoleLauncher test.MyClassTest

尴尬的命令,但这就是不使用Maven的代价。我建议您在了解模块路径的概念后,在命令文档中阅读这些选项。这里需要注意的一件重要事情是几个选项:

--patch-module my.module=.

这是必需的,因为示例测试代码具有与模块 相同的包 ()。没有它,模块系统就会抱怨。mypackagemy.module

--add-reads my.module=org.junit.platform.console.standalone

这使得 junit 需要,即使它没有在 中声明。my.modulemodule-info.java

org.junit.platform.console.standalone自动模块的名称,派生自 Jar 清单(如 JUnit 5 的情况),否则派生自 Jar 文件的名称(例如,在 JUnit 4 的情况下)。

另请注意,这是 Maven 在编译和运行单元测试时可能在幕后执行的操作(有关手动执行上述操作的等效插件配置,请参阅此问题)。

如果出于某种原因,您还想模块化您的单元测试,该怎么办?

在本例中,由于在上面的示例中,单元测试共享同一个包,因此您可以将它们包含在 JUnit 中并向其中添加要求:my.module

module my.module {
    exports mypackage;
    requires org.junit.platform.console.standalone;
}

如果单元测试位于不同的包中,您还可以将它们拆分为两个模块(两个),a和a,其中只有后者需要JUnit。module-info.javamy.modulemy.test.module

如果确实在模块中包含测试类,则在上述命令中,不需要 和 。--add-reads--patch-module


答案 2

测试本身位于模块中的一个原因是六边形架构。测试模块是一个驱动程序适配器,可与运行业务逻辑的其他适配器交换。

在我的情况下,我将使用jaba 9来做到这一点,而不需要maven。

这是我关于六边形架构的文章:

https://softwarecampament.wordpress.com/portsadapters/


推荐