我在这样的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的方式不正确?
答案 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
中找到解决方案。
您的问题也可能是重复的问题,因为我为您提供的链接中也提到了类似的问题。