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