Kotlin中带有@Captor批注的ArgumentCaptor

时间:2018-09-24 07:34:43

标签: android unit-testing kotlin mockito

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

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

}

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

我的问题是我得到了:

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

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

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

2 个答案:

答案 0 :(得分:2)

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

mockObject).callMethod( any : Any? )

解决此问题的另一种方法是使用mockito-kotlin,它避免了这样的IllegalStateException和mockito4kotlin.annotation的@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)

}

希望我能帮上忙。

答案 1 :(得分:-1)

如果使用的是Mockito,则需要在测试类MockitoAnnotations.initMocks(this)方法中调用setup。您的captor属性从未初始化,这就是为什么您会收到IllegalStateException。

修改: 我想您会在此opting for using namespace std中找到解决方案。 您的问题也可能是重复的问题,因为我为您提供的链接中也提到了类似的问题。