mockito - 在 Kotlin 函数上使用 Mokito anyObject() 时,指定为非 null 的参数为 null

标签 mockito kotlin

我的代码如下,引用https://stackoverflow.com/a/30308199/3286489中的解决方案

import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.*

class SimpleClassTest {

    private fun <T> anyObject(): T {
        Mockito.anyObject<T>()
        return uninitialized()
    }

    private fun <T> uninitialized(): T = null as T
    lateinit var simpleObject: SimpleClass
    @Mock lateinit var injectedObject: InjectedClass


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

    @Test
    fun testSimpleFunction() {
        simpleObject = SimpleClass(injectedObject)

        verify(injectedObject).settingDependentObject(anyObject())

    }
}

我仍然有以下错误

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method my.package.InjectedClass.settingDependentObject, parameter dependentObject

我错过了什么吗?

更新 下面是经过测试的代码(最简单的形式和工作)

class SimpleClass(val injectedClass: InjectedClass) {

    fun simpleFunction() {
        injectedClass.settingDependentObject(DependentClass(Response.Builder().build()))
    }
}

open class DependentClass(response: Response) {

}

open class InjectedClass() {
    lateinit var dependentObject: DependentClass

    fun settingDependentObject(dependentObject: DependentClass) {
        this.dependentObject = dependentObject
    }
}

最佳答案

默认情况下 Kotlin classes and members are final 。模拟cannot mock final classes or methods . 因此,当您编写时:

verify(injectedObject).settingDependentObject(anyObject())

调用真正的实现,它需要非空参数。

要解决此问题,请打开您的类和方法,或者更好的是,更改 SimpleClass 以接受接口(interface)作为其构造函数参数并改为模拟接口(interface)。

关于mockito - 在 Kotlin 函数上使用 Mokito anyObject() 时,指定为非 null 的参数为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37359648/

相关文章:

java - 测试气味……这是好习惯吗?

java - 如何使用 Azure SDK for Java v12 删除单个 Blob 文件?

java - 模拟具有通用(?扩展集合)返回类型的方法时遇到问题

java - Mockito:如何模拟在另一个方法中调用的方法

java - 验证是否调用了列表元素方法

android - Flutter Plugin 使用 Kotlin,Activity 总是返回 null

android - w : Detected multiple Kotlin daemon sessions at build/kotlin/sessions

android - 如何使用 kotlin 序列化我的类对象?

kotlin - 为什么 2 个 kotlin 降序 IntRanges 相等?

java - 无法使用 Mockito 模拟带注释的字段