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

class Target {
     fun <R> target(filter: String, mapper: (String) -> R): R = mapper(filter)
}

我可以在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;
}

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)
}

Kotlin版本我收到以下异常:
java.lang.IllegalStateException: Mockito.argThat<String> { true } must not be null

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

最佳答案

我也面临同样的问题。
最后,我发现argThat()将返回null,通常kotlin函数中的参数不接受null类型。argThatArgumentMatchers.java的源代码

public static <T> T argThat(ArgumentMatcher<T> matcher) {
    reportMatcher(matcher);
    return null;
}
您可以看到它是return null。因此,当我们模拟该函数时,它将抛出IllegalStateException,因为argThat 返回null ,且参数不能为null。
这意味着如果您的功能是:
fun doSomething(arg1: String): Int {
    // do something
}
当您像这样 mock 它时:
Mockito.`when`(
    doSomething(Mockito.argThat<String> { true })
).thenReturn(100)
它将抛出IllegalStateException
因此,您应该像这样更改功能:
fun doSomething(arg1: String?): Int {
    // do something
}
将“字符串”更改为“字符串?”,使其接受空类型。
我的解决方案是用类定义参数?这样它就可以接受null,但是我不知道这是否是一个很好的解决方案

10-05 21:09
查看更多