gpt4 book ai didi

java - 在没有 Maven 或 Gradle 的情况下将 JUnit 5 与 Java 9 结合使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:00 24 4
gpt4 key购买 nike

描述:

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

不想为此使用 Gradle 或 Maven 等构建工具。

问题:

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

  • 我需要两个 module-info.java 文件吗? (每个 src 文件夹一个)
  • 要让 JUnit 5 工作,我的 module-info.java 文件中需要哪些模块?

最佳答案

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

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

为此,您需要使用 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 工件;参见 the user guide)

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

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=.

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

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

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

org.junit.platform.console.standaloneautomatic 模块 的名称,派生自 Jar list (与 JUnit 5 一样),否则来自 Jar 文件的名称(例如,在 JUnit 4 的情况下)。

另请注意,这是 Maven 在编译和运行单元测试时可能在幕后所做的事情(请参阅 this issue 以获取手动执行上述操作的等效插件配置)。

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

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

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

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

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

关于java - 在没有 Maven 或 Gradle 的情况下将 JUnit 5 与 Java 9 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com