Kotlin和mockito:在函数开头使用vararg时键入不匹配

问题描述 投票:2回答:1

给定一个类,如下面的“目标”类:

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

我知道vararg通常会到达函数的末尾,实际上如果你将vararg移动到最后它编译。

一旦mockito查看字节码,我想知道是否可以在这种奇怪的方法中使用mockito。

Edit

代码按预期运行,只有在您尝试模拟时才会出现问题。

fun main(args: Array<String>) {
    val result = Target().target("Hello World") {
        123
    }
    println("$result == 123? ${result == 123}")
}
// out:
// [Hello World]
// 123 == 123? true
generics kotlin mockito variadic-functions
1个回答
2
投票

使用命名参数。在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)
}
© www.soinside.com 2019 - 2024. All rights reserved.