一般来说,没有必要模块化你的测试代码(至少我想不出一个有效的理由,也许有人可以给出一个令人满意的反例)。只有一个文件可以(毕竟,甚至不需要模块化主代码)出现在主代码中。module-info.java
src
由于该文件将仅位于主源目录中,而不在测试源目录中,因此从逻辑上讲,它不应依赖于 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=.
这是必需的,因为示例测试代码具有与模块 相同的包 ()。没有它,模块系统就会抱怨。mypackage
my.module
--add-reads my.module=org.junit.platform.console.standalone
这使得 junit 需要,即使它没有在 中声明。my.module
module-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.java
my.module
my.test.module
如果确实在模块中包含测试类,则在上述命令中,不需要 和 。--add-reads
--patch-module