java - Mockito的argThat在Kotlin中返回null

标签 java kotlin mockito

给定以下类(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,但是我不知道这是否是一个很好的解决方案

关于java - Mockito的argThat在Kotlin中返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52389727/

相关文章:

java.io.RandomAccessFile 可扩展性(或其他选项)

java - 替换java中arraylists的arraylist中的x,y

spring-boot - Spring Boot Gradle Kotlin构建

android - 我从使用 MVVM 的改造中得到了多个响应 - kotlin

java - 如何为这些类型的方法编写单元测试?

java - PowerMock 和 Mockito UnfinishedVerificationException

java - 是否可以覆盖子类测试脚本中的 junit 规则?

java - 如何用Java从远程Unix系统获取 "tail -f"文件?

kotlin - 结果一直在说: “Type mismatch: inferred type is Unit but String was expected”

java - Mockito 想要但没有调用实用程序类