带有@Captor注释的ArgumentCaptor在Kotlin中

问题描述 投票:2回答:2

我在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)

}

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

我的问题是我得到了:

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

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

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

android unit-testing kotlin mockito
2个回答
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
投票

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

编辑:我认为你会在这个stackoverflow question找到解决方案。您的问题可能也是一个重复的问题,因为类似的问题在我提供给您的链接中说明。

© www.soinside.com 2019 - 2024. All rights reserved.