首页 > 解决方案 > Kotlin 中带有 @Captor 注释的 ArgumentCaptor

问题描述

我像这样在 Kotlin 中使用带有@Captor注释的ArgumentCaptor

@Captor private lateinit var captor: ArgumentCaptor<MyObject>
@Mock private lateinit var mockObject: InnerObject
private lateinit var objectToTest: MyClass

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)

    objectToTest = MyClass(mockObject)
}

fun testSomething() {
    objectToTest.doSomething()

    verify(mockObject).callMethod(captor.capture())
    assertThat(expectedResult, captor.value)

}

方法 callMethod() 在 doSomething() 内部被调用,我想捕获发送给它的参数。

我的问题是我得到:

java.lang.IllegalStateException: captor.capture() must not be null

我使用 java 尝试了相同的方法并且它正在工作,当我将它转换为 Kotlin 时,我得到了异常。

这与 Kotlin 有关吗?还是我没有以正确的方式使用@Captor?

标签: androidunit-testingkotlinmockito

解决方案


它与 Kotlin 相关,因为默认情况下所有参数和字段都不可为空。你必须定义 callMethod 的参数可以为空:

mockObject).callMethod( any : Any? )

解决它的另一种方法是使用mockito-kotlin,它避免了 mockito4kotlin.annotation 的 IllegalStateException 和 @KCaptor注释

import org.mockito4kotlin.annotation.KCaptor
import org.mockito4kotlin.annotation.MockAnnotations

@KCaptor
lateinit var captor: KArgumentCaptor<MyObject>

fun setUp() {
    MockAnnotations.initMocks(this)

    objectToTest = MyClass(mockObject)
}

fun testSomething() {

    objectToTest.doSomething()


    verify(mockObject).callMethod(captor.capture())
    assertThat(expectedResult, captor.value)

}

推荐阅读