【问题标题】:Kotlin and mockito: Type mismatch when using vararg on the begin of the functionKotlin 和 mockito:在函数开头使用 vararg 时类型不匹配
【发布时间】:2018-09-17 21:45:00
【问题描述】:

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

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) -&gt; Int)! but String was expected

我知道 vararg 通常会放在函数的末尾,事实上,如果您将 vararg 移到它编译的末尾。

一旦 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

【问题讨论】:

    标签: generics kotlin mockito variadic-functions


    【解决方案1】:

    使用命名参数。在 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)
    }
    

    【讨论】:

    • 惊人的答案!命名参数的简单性从未出现在我的脑海中!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2020-09-06
    • 2020-10-18
    相关资源
    最近更新 更多