【问题标题】:ArgumentCaptor with @Captor annotation in KotlinKotlin 中带有 @Captor 注释的 ArgumentCaptor
【发布时间】:2018-09-24 07:34:42
【问题描述】:

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


    【解决方案1】:

    和 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)
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,是的,我正在初始化。我用我的更多代码更新了帖子
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2017-05-22
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多