Kotest:PythagTriple示例因错误的函数调用而失败



我正在使用IntelliJ和Maven,已经下载了Kotest插件,并且我已经将依赖项添加到pom.xml(Kotest-runner-junit5-jvm,Kotest-assertions核心jvm,Kotest属性jvm,所有版本5.5.0(。

以下基本示例正在工作:

class MyFirstTestClass : FunSpec({
test("my first test") {
1 + 2 shouldBe 3
}
})

但我无法再举一个例子,PythagTriple:

import io.kotest.core.spec.style.FunSpec
import io.kotest.core.spec.style.StringSpec
import io.kotest.data.forAll
import io.kotest.matchers.shouldBe
data class PythagoreanTriple(
val a: Int,
val b: Int,
val c: Int
)
class MyTests : FunSpec({
context("Pythagorean triples tests") {
forAll(
PythagoreanTriple(3, 4, 5),
PythagoreanTriple(6, 8, 10),
PythagoreanTriple(8, 15, 17),
PythagoreanTriple(7, 24, 25)
) { (a, b, c) ->
isPythagoreanTriple(a, b, c) shouldBe true
}
}
})
fun isPythagoreanTriple(a: Int, b: Int, c: Int): Boolean = a * a + b * b == c * c

我可以找到这个例子的两个变体,一个使用forAll,另一个使用withData。两者都不起作用。

似乎有两个问题:

(1(

Kotlin: None of the following functions can be called with the arguments supplied: 
public suspend fun <A> forAll(vararg rows: Row1<TypeVariable(A)>, testfn: suspend (TypeVariable(A)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B> forAll(vararg rows: Row2<TypeVariable(A), TypeVariable(B)>, testfn: suspend (TypeVariable(A), TypeVariable(B)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C> forAll(vararg rows: Row3<TypeVariable(A), TypeVariable(B), TypeVariable(C)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D> forAll(vararg rows: Row4<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D, E> forAll(vararg rows: Row5<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D, E, F> forAll(vararg rows: Row6<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D, E, F, G> forAll(vararg rows: Row7<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D, E, F, G, H> forAll(vararg rows: Row8<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G), TypeVariable(H)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G), TypeVariable(H)) -> Unit): Unit defined in io.kotest.data
public suspend fun <A, B, C, D, E, F, G, H, I> forAll(vararg rows: Row9<TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G), TypeVariable(H), TypeVariable(I)>, testfn: suspend (TypeVariable(A), TypeVariable(B), TypeVariable(C), TypeVariable(D), TypeVariable(E), TypeVariable(F), TypeVariable(G), TypeVariable(H), TypeVariable(I)) -> Unit): Unit defined in io.kotest.data

使用withData只会导致未解析的引用:withData,而且我还没有找到导入。

(2(

Kotlin: Cannot infer a type for this parameter. Please specify it explicitly.

这似乎指的是以下内容:

{ **(a, b, c)** ->
isPythagoreanTriple(a, b, c) shouldBe true
}

这些肯定是我无法解决的一些基本问题,因为我是一个新手。如有任何帮助,我们将不胜感激。

有三个错误使您的测试不起作用:

  1. 您的测试设置不包含测试,而只包含上下文。这可以简单地通过将context改变为test来解决
  2. 对于forAll-行,您不应该使用自己的数据类型,但正如(1(中的消息所示,forAll的不同变体是为数据类型Row1Row2Row3等定义的。它们中的每一个都可以使用row(...)创建。(对于从1到14的每个arity,都有一个row函数。(
  3. forEach的变体不是指定具有一个RowX参数的函数,而是指定具有X参数类型的函数,这些参数类型是RowX的参数类型。因此,参数a, b, c被括号包围是不正确的——括号是将一个参数分解为其组件的一种表示法

当您以以下方式更改测试时,总的来说,您的测试是有效的:

class PythagoreanTripleTest : FunSpec({
test("Pythagorean triples tests") {
forAll(
row(3, 4, 5),
row(6, 8, 10),
row(8, 15, 17),
row(7, 24, 25)
) { a, b, c ->
isPythagoreanTriple(a, b, c) shouldBe true
}
}
})

最新更新