如何将 JUnit 5 与 Gradle 结合使用?

2024-05-08

在成功运行 JUnit 4 测试后,我尝试将 JUnit 5 与 Gradle 一起使用。

预期结果:JUnit 4 测试在输出中给出了很好的“通过”结果,并在build/reports/tests.

实际结果:下面的 JUnit 5 测试不输出任何内容(...) build successful,虽然我知道测试实际上并未运行,因为没有测试日志输出通过/跳过/失败,并放置fail在测试中保持构建成功。

Running gradle test --info yields Skipping task ':testClasses' as it has no actions.其中很多我认为大多是不相关的输出。 令人惊讶的是,它还说Executing task ':test' and Generating HTML test report... Finished generating test html results和 xml 类似build/test-results/test,虽然没有生成xml,但html显示没有测试运行,也没有错误,并且测试确实没有运行。

我也觉得很有趣的是gradle test --debug yields

[TestEventLogger] Gradle Test Run :test STARTED
[org.gradle.api.internal.tasks.testing.junit.JUnitDetector] test-class-
scan : failed to scan parent class java/lang/Object, could not find the class file
[TestEventLogger]
[TestEventLogger] Gradle Test Run :test PASSED

虽然我唯一的测试包含

fail("test fails");

我觉得这很奇怪!

我的构建文件是

apply plugin: 'java'

test {
    dependsOn 'cleanTest' // run tests every time

}

sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
    test {
        java {
            srcDirs 'test'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // when using this, it worked with a junit 4 test
//    testCompile 'junit:junit:4.10'
    // this should be needed for junit 5 (using M4 is required since IJ 2017.1.2
    testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
}

test {
    testLogging {
        events "passed", "skipped", "failed"
    }
}

我的测试是

package mypackage;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class HelloWorldTest {
    @Test
    public void testHelloWorld(){
        assertEquals(2, 1+1, "message");
    }
}

我的文件夹结构是,使用包mypackage,

java-template-project
--- src
    --- mypackage
        --- HelloWorld.java
--- test
    --- mypackage
        --- HelloWorldTest.java

在我正在使用的 IntelliJ 2017.1.3 中,模块结构如下所示

java-template-project
--- java-template-project_main
    --- src/mypackage
        --- HelloWorld(.java)
--- java-template-project_test
    --- test/mypackage
        --- HelloWorldTest(.java)

因为 Gradle 现在希望源代码和测试放在自己的包中。

我尝试过的

显然这不是关于这个话题的第一个问题,我发现的所有相关问题都是

  • 在 IntelliJ 中运行 jUnit 5 测试的 Gradle 项目 https://stackoverflow.com/questions/38293901/gradle-project-running-junit-5-tests-in-intellij

    但正如您所看到的,这是针对旧版本的 IntelliJ,并且我已经根据一个 JUnit 依赖行中的答案之一使用 IJ 2016.3.3 及更高版本的语法,因此应该没问题。

  • 使用 gradle 在 intellij 中从 JUnit 4 升级到 JUnit 5 https://stackoverflow.com/questions/38576011/upgrade-from-junit-4-to-junit-5-in-intellij-with-gradle

    链接回上述问题,并链接到此Jetbrains 博客 https://blog.jetbrains.com/idea/2016/08/using-junit-5-in-intellij-idea/它使用与上面问题相同的行。还链接到:

  • 将 JUnit 5 测试结果与 Intellij 测试报告集成 https://stackoverflow.com/questions/38576108/integrate-junit-5-tests-results-with-intellij-test-report在问题中,这也显示为依赖性

     testRuntime("org.junit.vintage:junit-vintage-engine:5.0.0-M1")
    

    这是在中解释的当我在 IntelliJ 中运行 TestCase 时,为什么 JUnit Jupiter 和 JUnit Vintage 是分开的? https://stackoverflow.com/questions/38822189/why-were-junit-jupiter-and-junit-vintage-separated-when-i-running-testcase-in-in好吧,当我运行它时,输出显示它找不到这个版本,但是根据Maven 存储库 https://mvnrepository.com/artifact/org.junit.vintage/junit-vintage-engine/4.12.0-M4这是针对 JUnit 5 的:

     testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
    

    那里的答案指出,您可以只在 IntelliJ 中运行测试,因为更高版本有 JUnit 5 支持。我知道,当我从 IntelliJ 中运行时,测试运行良好。但我想使用 Gradle(和 Travis,需要依赖管理)。

  • 如何在junit 5 gradle测试报告中捕获stdout/stderr? https://stackoverflow.com/questions/43151448/how-to-capture-stdout-stderr-in-junit-5-gradle-test-report

    我尝试使用

     testCompile("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
     testCompile("org.junit.jupiter:junit-jupiter-engine:5.0.0-M3")
    

    但结果没有改变。

    我的模板项目位于https://github.com/PHPirates/java-template-project https://github.com/PHPirates/java-template-project但这个问题应该包含所有必要的信息。


新增内容:Gradle 4.6 中的 JUnit 5 支持

正如所指出的在这个 GitHub 问题中 https://github.com/gradle/gradle/issues/828#issuecomment-368549611从 Gradle 4.6 开始支持 JUnit 5! 4.6 的官方发行说明(正在编辑最新版本,但请检查GitHub 发布页面 https://github.com/gradle/gradle/releases以确保您使用最新版本)在 docs.gradle.org https://docs.gradle.org/4.6/release-notes.html#junit-5-support。旧的设置仍然可以工作,但是使用它可以使构建文件更加干净。

[2019 年 5 月编辑] 正如 @deFreitas 在他的文章中指出的answer https://stackoverflow.com/a/55109990/4126843,JUnit 文档已经改进,现在他们在以下位置提供了完整的示例https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle,特别参见build.gradle https://github.com/junit-team/junit5-samples/blob/r5.4.0/junit5-jupiter-starter-gradle/build.gradle那里。幸运的是,事实证明它实际上与此答案中的相同。

更新 Gradle

首先,确保您使用的是最新的 Gradle 版本,检查最新版本在他们的 GitHub 版本中 https://github.com/gradle/gradle/releases。例如,如果是 4.6,请在项目位置的终端中运行gradlew wrapper --gradle-version=4.6或者确保更新此行gradle/wrapper/gradle-wrapper.properties file: distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip.

如何使用内置的 JUnit 5

然后是问题中的java文件、目录结构等build.gradle文件将是(使用新的plugins block)

plugins {
    id 'java'
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.3'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.0.3'
}

// These lines can be removed when you use the default directories src/main/kotlin and src/test/kotlin
sourceSets {
    main.java.srcDirs += 'src'
    main.resources.srcDirs += 'src'
    test.java.srcDirs += 'test'
    test.resources.srcDirs += 'test'
}

// Java target version
sourceCompatibility = 1.8

test {
    // Enable JUnit 5 (Gradle 4.6+).
    useJUnitPlatform()

    // Always run tests, even when nothing changed.
    dependsOn 'cleanTest'

    // Show test results.
    testLogging {
        events "passed", "skipped", "failed"
    }
}

PS 对于绝对最小版本,请参见雷的回答 https://stackoverflow.com/a/50558072/4126843.

安卓(参见这篇文章:用于 Android 测试的 JUnit 5 https://stackoverflow.com/a/53674289/8583692)

在 Android 上,我通过将以下内容添加到我的应用程序模块构建文件中,成功运行了问题中的 JUnit 5 测试。如您所见,依赖项是相同的,但我不需要useJUnitPlatform()并且测试配置块略有不同。

apply plugin: 'com.android.application'
// In fact I am not sure you need this, but I had it included to run Spek tests anyway
apply plugin: 'de.mannodermaus.android-junit5' 

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}


android {
    // I'm omitting your other configurations like compileSdkVersion, buildTypes etc.

    testOptions {
        unitTests.all {

            // Always run tests, even when nothing changed.
            dependsOn 'clean'

            // Show test results.
            testLogging {
                events "passed", "skipped", "failed"
            }
        }
    }
}

however,它只对我执行 Gradle 时有效test task, not当我运行check任务。像往常一样,我通过创建失败的测试来测试这一点,然后尝试 Gradle 任务是否通过或失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 JUnit 5 与 Gradle 结合使用? 的相关文章

  • 我应该更改单元测试的命名约定吗?

    我目前对单元测试使用一个简单的约定 如果我有一个名为 EmployeeReader 的类 我将创建一个名为 EmployeeReader Tests 的测试类 然后 我在测试类中为该类创建所有测试 名称如下 Reading Valid Em
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。在 android studio Chipmunk 中添加新的依赖项时

    这些是我的等级文件 项目 Top level build file where you can add configuration options common to all sub projects modules plugins id
  • Kotlin 无法编译库

    There s this http github com theapache64 BugMailer我创建的库是为了通过电子邮件报告异常情况 它适用于 Android Java 项目 但不适用于 Android Kotlin 当我添加库的编
  • 如何使用 React 和 Jest 模拟 onPaste 事件?

    我正在尝试在我的反应项目上使用 JEST 测试来模拟粘贴事件 我有一个外部组件 App 其中包含带有 onPaste 事件的输入字段 我想测试过去的数据并检查输入值 it on past with small code gt Create
  • java模拟自定义对象

    public class MainClass public void makeCall CustomObject obj new CustomObject obj testMethod 我想进行单元测试makeCall 所以我必须嘲笑Cus
  • 需要帮助理解这段代码

    我正在尝试学习单元测试 我正在尝试对我在 asp net mvc 1 0 中制作的一些会员资格内容进行单元测试 我一直在关注一本关于 MVC 的书 我对一些东西感到困惑 希望有人能为我解答 我的框架使用 Nunit 和 Moq 问题一 pu
  • 如何通过 mat-dialog-close 或其他方式对 MatDialog 是否关闭进行单元测试

    我有一个简单的组件 它将显示为对话框窗口垫对话框 https material angular io components dialog overview 在该组件的模板中 一个按钮标记为垫子对话框关闭 https material ang
  • gradle 复制为 doLast 不起作用

    我正在尝试做一件非常简单的事情 由于 gradle 在清理时会删除构建目录中的所有文件 因此我想在创建发布版本时将 apk 移至其他位置 所以我在链中添加了一个复制任务 并将其设置为最后一个 我尝试过的任何方法都不起作用 所以我简化了它并添
  • Android:UiTesting 时运行时错误

    我正在尝试运行 Ui 测试 每次运行应用程序时 它都会在控制台中出现以下错误并关闭正在运行的应用程序 我导入了 uiautomator jar android jar 和 JUnit4 库 我正在使用 Eclipse 我在这里缺少什么 20
  • Android minSdkVersion 与 Flutter(v2.8.1)

    我已经安装了 firebase 包 据我们所知minSdkVersion 19被推荐 所以 我想做这个过程 但是 我看到这一行包含在android app build gradle file minSdkVersion flutter mi
  • 在 Composite WPF (Prism) 中,我应该如何对我的控制器进行单元测试?

    我正在使用一个模块构建一个基本的复合 WPF Shell 我想对我的模块进行单元测试 显然 Composite WPF 以一种易于单元测试的方式模块化我的代码 下面是我想要进行单元测试的代码 它驻留在我的模块的控制器中 请注意标准复合 WP
  • 找不到参数 org.gradle.api.Project 的方法 android()

    遇到错误 当我尝试在工作室中编译我的项目时 我进行了相当多的搜索 但没有真正的解决方案 错误 17 0 在 org gradle api Project 类型的根项目 booksStudioDir 上找不到参数 build a7zf1o8g
  • 如何将Sinon添加到Angular 2测试中?

    我想添加Sinon进行测试 但无法让它运行 我已经安装了 sinon 和 karma sinon 作为 DevDependency 将 sinon 添加到我的 karma 配置文件中的框架中 frameworks jasmine brows
  • android gradle插件-离线安装

    我必须在离线电脑上安装 android gradle 插件 通过谷歌搜索 我了解到我可以通过本地 Maven 存储库来做到这一点 但从不成功的尝试和所有关于这个问题的质量保证中我知道这并不简单 我从来没有和maven一起工作过 有经验的人可
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 我可以获取 JAVA 语句中“gradle.properties”中定义的属性吗?

    我定义了一个属性gradle properties文件如下 user password mypassword 我可以在 java 语句中将它用作变量值吗 是的 您可以 但这不是一个好主意 也不是一个好的做法 gradle propertie
  • 如何跨多个文件跨越 javascript 命名空间?

    我永远忽略了javascript 几年前我开始使用 jQuery 这样我就可以过得去 但随着我开始更多地进行 TDD 我昨天决定真正深入研究 javascript 之后可能还有咖啡脚本 在我的 ASP NET Web 窗体应用程序中 我有很
  • ArgumentMatchers.any 不得为 null

    我正在尝试测试ViewModel以确保实时数据得到正确更新 然而使用时ArgumentMatchers any 它失败了IllegalStateException saying ArgumentMatchers any mViewModel
  • 使用mockery和sinon模拟类方法

    我正在学习使用带有 sinon 的节点模块模拟进行单元测试 仅使用模拟和普通类 我就可以成功注入模拟 不过 我想注入一个 sinon 存根而不是一个普通的类 但我在这方面遇到了很多麻烦 我试图嘲笑的班级 function LdapAuth
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后

随机推荐

  • Jenkins 中的 Powershell 转义路径字符

    我有一个声明性管道 应该执行 powershell 步骤来安装路径 路径作为参数提供 parameters string name UNC defaultValue server01 lab local shared data descri
  • 使用 VBA 在另一个 Access 实例中打开特定窗体

    所以我在这里四处查看并找不到我的问题的答案 至少不完全是 案例如下 我在 DBase1 中 想要单击一个按钮并在单独的访问实例中打开 DBase2 中的 NeuSteckbrief 表单 我设法使用以下代码在单独的实例中打开 DBase2
  • 具有水平和垂直冻结窗格的 Gridview

    在你说之前 是的 这个问题可能是重复的 https stackoverflow com questions 2912890 gridview freeze pane solutions https stackoverflow com que
  • 配置 Visual Studio 以使用更多内存

    我曾经读过一篇关于如何增加 Visual Studio 将使用的 RAM 量的博客文章 当我尝试在 Visual Studio 编辑器中复制一小行文本时 收到 没有足够的可用内存 错误消息 有谁知道我可以如何或在哪里配置它 这是符合您的描述
  • 使用 python 中的 java 库

    我有一个 python 应用程序和 java 应用程序 python 应用程序为 java 应用程序生成输入并在命令行上调用它 我确信一定有一个更优雅的解决方案 就像使用 JNI 从 Java 调用 C 代码一样 有什么指点吗 仅供参考 我
  • 如何从 docker 容器运行 webpack 构建?

    我正在制作的应用程序是用 ES6 编写的 其他好东西是由 Docker 容器内的 webpack 转译的 目前 一切工作从创建内部目录 安装依赖项到创建编译的捆绑文件 当运行容器时 它说 dist bundle js 不存在 除非我在主机目
  • XCode 4.2 编译器错误

    当我使用 XCode 4 2 创建新项目 例如 单视图 iOS 应用程序 时 支持文件 文件夹中的 main m 文件如下所示 import
  • 如何通过名称获取函数地址?

    我想通过名称获取函数的地址 例如 目前我正在使用dlsym unsigned long get func addr const char func name return unsigned long dlsym NULL func name
  • 无法在 Spring boot 中使用 findOne() 方法

    我的项目是关于用户管理器网络的 我是 Spring 和 Java 的新手 这是我的代码 在 UserController 中 RequestMapping value users name method RequestMethod GET
  • 检索博客中所有标签的列表

    有没有办法使用 gdata api 检索所有列表labels在博主中 我需要根据该列表创建一个菜单 但不能简单地列出所有帖子并获取它 因为它是一个繁忙的博客 并且有超过 2000 个帖子 以下是使用 json 调用获取标签列表的最简单方法
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Swift - 对数组中每个字符串中的字符进行排序

    所以这个问题是这个问题的后续问题 允许相同字符串的快速字符串排列 https stackoverflow com questions 48976065 swift string permutations allowing the same
  • 何时应使用服务器端与客户端 Facebook 身份验证流程?

    Facebook 有两个身份验证流程 客户端和服务器端 每一项应该在什么时候使用 脸书文档 https developers facebook com docs authentication https developers faceboo
  • 如何从数据表中设置 DataGridViewComboBoxColumn 中的值?

    DataGridViewComboBoxColumn dgvcb DataGridViewComboBoxColumn grvPackList Columns Units Globals G ProductUtility G Utility
  • 从成员函数返回枚举

    我想实现返回枚举的函数 class myClass private res res public enum res ok fail res getRes bool checkRes res r other function that cha
  • 无法将参数值从字符串转换为小数?

    我有一个像这样的存储过程 ALTER PROCEDURE dbo usp CSR UpdateDailyCustomerWithLCDHistory Add the parameters for the stored procedure h
  • 参考当前命令的先前参数

    例如 我想执行以下操作 mv xxxx xxxx bak 我知道我可以使用这个命令 mv xxxx bak 我认为这在某种程度上并不直接 如果我能做到这一点那就太好了 mv xxxx 1 bak 有时我需要这样 echo xxxx yyyy
  • 带有电子墨水显示屏的 Android

    我有兴趣使用 AndroidE Ink http www eink com technology howitworks html为基础的平台 我知道已经是证明了 http vimeo com 3162590MOTO 曾经使用过 但我有兴趣将
  • 如何在 AngularJS 初始化之前防止元素显示( ng-show )

    在AngularJS中 我想知道如何防止在ng show生效之前页面上显示的元素 我发现一些帖子谈论ng cloak 但在我的情况下似乎不起作用 可能ng cloak是为了防止双花括号而不是 Element 样式 有人谈论的另一种方式是在
  • 如何将 JUnit 5 与 Gradle 结合使用?

    在成功运行 JUnit 4 测试后 我尝试将 JUnit 5 与 Gradle 一起使用 预期结果 JUnit 4 测试在输出中给出了很好的 通过 结果 并在build reports tests 实际结果 下面的 JUnit 5 测试不输