Kotlin 和 mockito:在函数开头使用 vararg 时类型不匹配
Kotlin and mockito: Type mismatch when using vararg on the begin of the function
给定一个 class,例如下面的 "Target" class:
class Target {
fun <R> target(vararg filter: String, mapper: (String) -> R): R {
println(filter.contentDeepToString())
return mapper("target")
}
}
还有如下测试:
@Test
fun test() {
val mockTarget = mock(Target::class.java)
Mockito.`when`(mockTarget.target<Int>("Hello World", any<(String) -> Int>()))
.thenReturn(1)
}
我收到 Type mismatch: inferred type is ((String) -> Int)! but String was expected
。
我知道可变参数通常会到达函数的末尾,事实上,如果您将可变参数移动到函数末尾,它就会编译。
一旦 mockito 查看字节码,我想知道是否可以在这种奇怪的方法中使用 mockito。
编辑
代码按预期运行,问题仅在您尝试模拟时发生。
fun main(args: Array<String>) {
val result = Target().target("Hello World") {
123
}
println("$result == 123? ${result == 123}")
}
// out:
// [Hello World]
// 123 == 123? true
使用命名参数。在您的 lambda 之前添加 mapper =
,如下所示:
@Test
fun test() {
val mockTarget = Mockito.mock(Target::class.java)
Mockito.`when`(
mockTarget.target<Int>(
"Hello World",
mapper = Mockito.any<(String) -> Int>()
)
).thenReturn(1)
}
给定一个 class,例如下面的 "Target" class:
class Target {
fun <R> target(vararg filter: String, mapper: (String) -> R): R {
println(filter.contentDeepToString())
return mapper("target")
}
}
还有如下测试:
@Test
fun test() {
val mockTarget = mock(Target::class.java)
Mockito.`when`(mockTarget.target<Int>("Hello World", any<(String) -> Int>()))
.thenReturn(1)
}
我收到 Type mismatch: inferred type is ((String) -> Int)! but String was expected
。
我知道可变参数通常会到达函数的末尾,事实上,如果您将可变参数移动到函数末尾,它就会编译。
一旦 mockito 查看字节码,我想知道是否可以在这种奇怪的方法中使用 mockito。
编辑
代码按预期运行,问题仅在您尝试模拟时发生。
fun main(args: Array<String>) {
val result = Target().target("Hello World") {
123
}
println("$result == 123? ${result == 123}")
}
// out:
// [Hello World]
// 123 == 123? true
使用命名参数。在您的 lambda 之前添加 mapper =
,如下所示:
@Test
fun test() {
val mockTarget = Mockito.mock(Target::class.java)
Mockito.`when`(
mockTarget.target<Int>(
"Hello World",
mapper = Mockito.any<(String) -> Int>()
)
).thenReturn(1)
}