Kotlin и mockito: несоответствие типов при использовании vararg в начале функции - PullRequest
0 голосов
/ 18 сентября 2018

Учитывая класс, такой как класс "Target" ниже:

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

1 Ответ

0 голосов
/ 18 сентября 2018

Использовать именованный аргумент.Добавьте 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)
}
...