junit-jupiter-api 和 junit-jupiter-engine 的区别

Posted

技术标签:

【中文标题】junit-jupiter-api 和 junit-jupiter-engine 的区别【英文标题】:Difference between junit-jupiter-api and junit-jupiter-engine 【发布时间】:2018-07-05 00:34:56 【问题描述】:

maven 模块junit-jupiter-apijunit-jupiter-engine 有什么区别?是否需要在build.gradle 中包含这两个依赖项?

我需要同时提供这两个依赖项吗?

testCompile("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
testCompile("org.junit.jupiter:junit-jupiter-api:$junitVersion")

或者只有一个依赖就足够了?

testCompile("org.junit.jupiter:junit-jupiter-engine:$junitVersion")

我需要添加对junit-vintage-engine的依赖吗?

【问题讨论】:

小改进:JUnit 团队的建议是两个引擎都使用testRuntime 【参考方案1】:

JUnit 5.4 之前的版本

来自the docs:

junit-jupiter-api

用于编写测试和扩展的 JUnit Jupiter API。

junit-jupiter-engine

JUnit Jupiter 测试引擎实现,仅在运行时需要。

junit-vintage-engine

JUnit Vintage 测试引擎实现允许在新的 JUnit 平台上运行老式 JUnit 测试,即以 JUnit 3 或 JUnit 4 风格编写的测试。

所以...

您需要 junit-jupiter-apijunit-jupiter-engine 来编写和运行 JUnit5 测试 您只需要 junit-vintage-engine 如果 (a) 您使用 JUnit5 并且 (b) 您的测试用例使用 JUnit4 构造/注释/规则等

JUnit 从 5.4 版开始

在 JUnit 5.4 中,这已被简化,有关详细信息,请参阅 this answer。

【讨论】:

您不需要同时添加两者,因为jupiter-apijupiter-engine 的传递依赖项。 在 5.5.1 版本中,我只能使用“junit-jupiter-api”编写和运行 junit 测试。 @gaurav,是的,这在我的答案的这一部分中有所介绍注意:在 JUnit 5.4 中,这是简化的,有关更多详细信息,请参阅 this answer。 @glytching,但@Gaurav(和我)只使用junit-jupiter-api,而不是junit-jupiter【参考方案2】:

junit-jupiter聚合器神器

JUnit 5.4 provides 如果您的意图是编写 JUnit 5 测试,则 Maven 配置要简单得多。只需指定名为 junit-jupiter 的聚合工件。

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

为了您的方便,这个工件依次自动提取以下三个工件:

junit-jupiter-api(编译依赖) junit-jupiter-params(编译依赖) junit-jupiter-engine(运行时依赖)

在您的项目中,您还会得到:

junit-platform-commons-1.4.0.jar junit-platform-engine-1.4.0.jar

以上内容是您基于新的 Jupiter 范例编写和运行 JUnit 5 测试所需要的。

旧版测试

如果您的项目有想要继续运行的 JUnit 3 或 4 测试,请为 JUnit Vintage Engine 添加另一个依赖项,junit-vintage-engine。见tutorial by IBM。

<!-- https://mvnrepository.com/artifact/org.junit.vintage/junit-vintage-engine -->
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

【讨论】:

我认为这是最好的答案。【参考方案3】:

请注意,junit-jupiter-api 作为子依赖项包含在 junit-jupiter-engine Maven 存储库中。因此,您只需要添加junit-jupiter-engine 即可获得两者。我敢肯定 gradle 是一样的。 https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine/5.1.1

【讨论】:

现在在 JUnit 5.4 及更高版本中简化为 &lt;artifactId&gt;junit-jupiter&lt;/artifactId&gt;【参考方案4】:

您的问题的最准确答案在junit-team/junit5-samples 存储库中。只需看看 junit5-jupiter-starter-gradle for Gradle 和 junit5-jupiter-starter-maven for maven。

正如您在两个示例中看到的,唯一需要的依赖项是junit-jupiter

【讨论】:

【参考方案5】:

如果你想使用 Junit 5 运行测试,你只需要junit-jupiter-api。如果您同时使用junit-jupiter-engine,您的测试将会中断并且不会运行。

我不确定为什么要放置它,但是,前面的答案告诉您需要同时使用两者是不正确的。

【讨论】:

以上是关于junit-jupiter-api 和 junit-jupiter-engine 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 1.5.10,Gradle 7.0.2_2 - 找不到方法 testCompile() group=org.junit.jupiter,name=junit-jupiter-api,ve

SpringMVC文件上传与下载

Spring boot 配置单元测试

Junit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.com

JUnit3 和 JUnit4的区别

testng和junit有啥优缺点,该如何选择