Mockito 的 argThat 在 Kotlin 中返回 null

ade*_*190 9 java mockito kotlin

给定以下类(用 kotlin 编写):

class Target {
     fun <R> target(filter: String, mapper: (String) -> R): R = mapper(filter)
}
Run Code Online (Sandbox Code Playgroud)

我可以在java中测试,测试代码:

@Test
public void testInJava() {
    Target mockTarget = Mockito.mock(Target.class);
    Mockito.when(mockTarget.target(
            argThat(it -> true),
            Mockito.argThat(it -> true)
    )).thenReturn(100);
    assert mockTarget.target("Hello World", it -> 1) == 100;
}
Run Code Online (Sandbox Code Playgroud)

java 测试按预期通过,但同样的测试是用 kotlin 编写的:

@Test
fun test() {
    val mockTarget = Mockito.mock(Target::class.java)
    Mockito.`when`(mockTarget.target(
            Mockito.argThat<String> { true },
            mapper = Mockito.argThat<Function1<String, Int>>({ true }))
    ).thenReturn(100)
    assert(mockTarget.target("Hello World") { 1 } == 100)
}
Run Code Online (Sandbox Code Playgroud)

kotlin 版本我收到以下异常:

java.lang.IllegalStateException: Mockito.argThat<String> { true } must not be null
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我如何使用 kotlin 进行测试?

fzy*_*cjy 6

2022 年,Mockito-Kotlin 正式解决了该问题。

修复非常简单:只需从包中导入argThat/ eq/... mockito-kotlin,而不是mockito包,一切就完成了!

相关: https: //github.com/mockito/mockito-kotlin/wiki/Mocking-and-verifying