在 junit 5 中隐式推断失败方法的类型
测试是任何应用程序开发的重要步骤,因为它有助于在开发阶段及早发现错误、提高应用程序的性能并降低开发成本。
假设测试是应用程序中的关键过程。 在这种情况下,建议使用测试驱动开发 (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{
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 = 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 = getstudents();
@test
fun checkemptyclass(){
if (students.isnotempty()){
fail("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 = 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 = 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 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
如何在 java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:java
-
本篇文章主要介绍如何在 java 中制造程序延迟。本教程介绍了如何在 java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 java 中把 hashmap 转换为 json 对象
发布时间:2023/12/17 浏览次数:187 分类:java
-
它描述了允许我们将哈希图转换为简单的 json 对象的方法。本文介绍了在 java 中把 hashmap 转换为 json 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 json 对象的详细例子。
如何在 java 中按值排序 map
发布时间:2023/12/17 浏览次数:171 分类:java
-
本文介绍了如何在 java 中按值对 map 进行排序。本教程介绍了如何在 java 中按值对 map
进行排序,并列出了一些示例代码来理解它。
如何在 java 中打印 hashmap
发布时间:2023/12/17 浏览次数:192 分类:java
-
本帖介绍了如何在 java 中打印 hashmap。本教程介绍了如何在 java 中打印 hashmap 元素,还列举了一些示例代码来理解这个主题。
在 java 中更新 hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:java
-
本文介绍了如何在 java 中更新 hashmap 中的一个值。本文介绍了如何在 java 中使用 hashmap 类中包含的两个方法-put() 和 replace() 更新 hashmap 中的值。
java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:java
-
本文介绍了 java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 java 中 map 和 hashmap 之间的主要区别。在 java 中,map 是用于以键值对存储数据的接口,
在 java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:java
-
这篇文章向你展示了如何在 java 中获取用户主目录。本教程介绍了如何在 java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:java
-
这篇文章教你如何知道 java 中大小和长度之间的区别。本教程介绍了 java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:java
-
了解有关 java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,