gpt4 book ai didi

kotlin - 在intellij中使用kotest时出现"the expression is unused"

转载 作者:行者123 更新时间:2023-12-02 02:26:28 25 4
gpt4 key购买 nike

使用 Kotest 编写的这个 kotlin 测试,IntelliJ 显示警告“表达式未使用”并且语法着色不起作用。另外,运行测试时,找不到测试。

class TalentMatchServiceSpec : StringSpec() {

init {


"add 3 to 2 should give 5"
{
// Given integers 2 and 3
val two = 2
val three = 3

// When adding both numbers
val sum = two + three

// Then the result is 5
sum shouldBe 5
}

}
}

最佳答案

@Thomas Martin 的答案是正确的,但您问为什么它会产生影响。

Kotest 中的 SpringSpec 依赖于一些 Kotlin DSL 功能来工作。让我们通过从头开始构建相同的函数来进行演示。

我们将从使用 Kotlin 的扩展函数开始。这允许我们向我们无法控制的类添加函数。

所以,

fun String.test(test: () -> Unit)

那么我们就可以在任何字符串上调用这个测试函数:

"this is a test".test({ 1 + 2 shouldBe 3 })

其次,Kotlin 允许将任何最终 lambda arg 带到括号之外。因此 foo(arg, arg2, arg3, lambda) 可以变成 foo(arg, arg2, arg3) lambda 。这意味着我们可以将测试编写为:

"this is a test".test { 1 + 2 shouldBe 3 } 

接下来,我们可以将函数标记为中缀,然后我们就不需要使用点来调用它们。所以我们的测试函数变成:

infix fun String.test(test: () -> Unit)

我们的测试现在看起来像:

"this is a test" test { 1 + 2 shouldBe 3 } 

最后,任何名为 invoke 并标记为运算符函数的函数都可以在没有函数名称的情况下调用。因此,Foo 类中的 operator fun invoke(a: String, b: String) 可以作为常规 Foo.invoke(a,b) 或只是 进行调用>Foo(a, b).

将所有这些放在一起,我们的最终测试函数如下所示:

operator fun String.invoke(test: () -> Unit)

我们的测试最终如下:

"this is a test" { 1 + 2 shouldBe 3 }

或更可能的是,

"this is a test" { 
1 + 2 shouldBe 3
}

如果将大括号移动到下一行,就像您原来的问题一样,它看起来就像一个字符串,后跟一个不相关的 lambda block 。两种不同的表达方式。

关于kotlin - 在intellij中使用kotest时出现"the expression is unused",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65577709/

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