迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

在 JUnit 5 中隐式推断失败方法的类型

作者:迹忆客 最近更新:2023/05/11 浏览次数:

测试是任何应用程序开发的重要步骤,因为它有助于在开发阶段及早发现错误、提高应用程序的性能并降低开发成本。

假设测试是应用程序中的关键过程。 在这种情况下,建议使用测试驱动开发 (TDD) 方法,该方法开始实施测试失败的任何功能,然后是最终使测试通过的实际代码。

可以在应用程序中进行不同类型的测试,包括单元测试、集成测试、功能测试等。 本教程将教授如何使用 JUnit 5 隐式推断在单元测试阶段使用的 fail() 方法的类型。


创建 Kotlin 项目并添加依赖项

打开 IntelliJ 开发环境并选择 File > New > Project。 在打开的窗口中,输入项目名称 kotlin-testing,在 Language 部分选择 Kotlin,在 Build system 部分选择 Gradle。

按创建按钮生成项目。

打开 build.gradle 文件并确保您具有 junit-jupiter-api 依赖项,如下所示。 这种依赖关系为我们提供了用于测试代码的 API。

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
    testImplementation 'org.jetbrains.kotlin:kotlin-test'
}

在 src/main/kotlin 文件夹下创建一个 Main.kt 文件,将以下代码复制并粘贴到该文件中。

class Student(
    var id: Int,
    var studentName: String?,
    var studentIDCard: String?){

    override fun toString(): String {
        return "student name: $studentName, ID card: $studentIDCard"
    }
}

fun getStudents(): List<Student>{
    return listOf(
        Student(1,"john doe","CSO12022"),
        Student(2,"mary public","CS022022"),
        Student(3,"elon mask","S032022")
    );
}

在上面的代码中,我们创建了一个包含学生对象的列表,我们将使用这个列表来进行测试。


没有足够的信息来推断类型变量 V

在 src/test/kotlin 文件夹下创建一个 Main.kt 文件,将以下代码复制并粘贴到该文件中。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

     @Test
    fun checkEmptyClass(){
        if (students.isNotEmpty()){
            fail("The class is not empty")
        }
    }

}

在这段代码中,我们创建了一个名为 checkEmptyClass() 的测试,它使用我们在上一节中创建的列表来检查它是否为空。 如果列表不为空,我们调用 fail() 方法并将错误消息作为该方法的参数传递。

请注意 ,我们使用 Assertions 类的静态方法 fail()。 该类的完全限定名称是 org.junit.jupiter.api.Assertions。

当使用此类中的 fail() 方法时,编译器会显示一条警告消息,其中没有足够的信息来推断类型变量 V,因为该方法是通用的,而且我们没有提供任何类型参数。


显式推断 fail() 方法的类型

首先想到的最简单的方法是显式提供类型参数来安抚编译器,如以下代码所示。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

      @Test
    fun checkEmptyClass(){
        if (students.isNotEmpty()){
            fail<String>("The class is not empty")
        }
    }

}

请注意 ,我们使用该语句来安抚编译器的原因是该类型永远不会返回,因为在到达 return 语句之前会抛出异常 org.opentest4j.AssertionFailedError。

简单来说,我们提供了一个在我们的代码中无用的通用参数。 下一节将展示我们如何在不显式提供通用参数的情况下调用此方法。

运行此测试并确保它失败并显示以下消息。

The class is not empty
org.opentest4j.AssertionFailedError: The class is not empty

将 fail() 方法与 Lambda 表达式一起使用

注释上面的例子,将下面的代码复制粘贴到src/test/kotlin文件夹下的Main.kt文件中。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

    @Test
    fun findInvalidStudentIDCard(){
       students.forEach { student: Student ->
           if (student.studentIDCard?.startsWith("CS") == true){
               println(student)
           }else{
               fail("$student has an invalid id");
           }
       }
    }

}

在此示例中,我们创建了一个名为 findInvalidStudentIDCard() 的测试,它遍历学生列表,使用有效的卡号记录学生,并在卡号无效时调用 fail() 方法。

我们使用了 forEach() 方法,它接受一个参数并且不返回任何值。 这通常被称为消费者。

使用 lambda 表达式时,我们不需要显式推断类型,因为编译器可以从传递给方法的 Consumer 推断类型。

在此代码中,编译器不会显示任何编译时错误。 运行此测试并确保输出如下所示。

student name: john doe, ID card: CSO12022
student name: mary public, ID card: CS022022

student name: elon mask, ID card: S032022 has an invalid id
org.opentest4j.AssertionFailedError: student name: elon mask, ID card: S032022 has an invalid id

隐式推断 fail() 方法的类型

注释上面的例子,将下面的代码复制粘贴到src/test/kotlin文件夹下的Main.kt文件中。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.fail

class TestStudents{
    private val students: List<Student> = getStudents();

    @Test
    fun checkClassSize(){
        if (students.count() < 5){
            fail("The class is not full")
        }
    }

}

在此示例中,我们创建了一个名为 checkClassSize() 的测试,用于计算列表中学生对象的数量,如果计数小于 5,我们将调用 fail() 方法并将错误消息作为参数传递给 方法。

请注意 ,此示例中的 fail() 方法不是 Assertions 类中的通用方法。 本例中的 fail() 方法来自 org.junit.jupiter.api 包,不是通用的。

由于该方法不是通用的,我们不需要传递任何参数。 运行此测试并确保输出如下所示。

The class is not full
org.opentest4j.AssertionFailedError: The class is not full

总结

在篇文章中,我们了解了使用 fail() 方法时导致编译时错误的原因。 我们已经了解了如何显式推断方法的类型以避免此警告。

在最后两节中,我们了解了在使用 lambda 表达式时如何隐式推断类型,以及如何避免使用非泛型方法推断类型。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Kotlin 中 Java String[] 的等价物

发布时间:2023/05/13 浏览次数:59 分类:Java

本文介绍了 Kotlin 中 Java String[] 的等价物。 我们将看到所有可能的方法来为 Kotlin 实现与 Java 中的 String[] 相同的结果。

将 Java 文件代码转换为 Kotlin

发布时间:2023/05/13 浏览次数:142 分类:Java

Kotlin 现在是一种官方的 Android 语言。 因此,您可能希望将 Java 文件更改为 Kotlin。 本文教您如何将 Java 转换为 Kotlin。

在 Kotlin 中使用 forEach

发布时间:2023/05/13 浏览次数:122 分类:Java

本文介绍 Kotlin 中 forEach 关键字的概念和使用。 我们将看到一些使用 Kotlin forEach 循环的示例来理解它。

在 Kotlin 中使用 reified 关键字

发布时间:2023/05/13 浏览次数:197 分类:Java

reified 关键字是在 Kotlin 中使用泛型时最常使用的编程概念。在本教程中,我们将学习如何使用两种方法解决此问题,包括将类型的类作为泛型函数的参数传递,以及将 reified 关键字与内联函数

Kotlin 中 ! 和 ? 运算符之间的区别

发布时间:2023/05/13 浏览次数:180 分类:Java

在 Kotlin 中,断言运算符 !! 和安全调用符 ? 使用 Null 安全。本文介绍空安全的概念。 我们也将通过如何! 和 ? 在 Kotlin 中有助于空安全。

Android Studio 中的 Kotlin 打印到控制台

发布时间:2023/05/13 浏览次数:52 分类:Java

Kotlin 的 logcat 窗口可以实时显示输出,让开发人员能够高效地处理他们的代码。 今天,我们将完成将消息打印到 Kotlin 控制台的步骤。

在 Kotlin 中获取随机数

发布时间:2023/05/13 浏览次数:68 分类:Java

随机数是使用一种算法从一组数字中生成的,该算法可确保每个数字的生成概率相等。在Kotlin中使用IntRange的random()扩展函数

在 Kotlin 中使用内联函数

发布时间:2023/05/13 浏览次数:199 分类:Java

Kotlin 允许使用内联函数有效地处理更高级的函数。 在本文中,我们将介绍我们需要了解的有关 Kotlin 中的内联函数的所有信息。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便