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

Ely*_*lye 10 mockito kotlin

我的代码如下,参考/sf/answers/2121573961/中的解决方案

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我仍然有以下错误

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method my.package.InjectedClass.settingDependentObject, parameter dependentObject
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

mie*_*sol 10

默认情况下,Kotlin 课程和成员是最终的.Mockito 无法模拟最终的类或方法.因此当你写:

verify(injectedObject).settingDependentObject(anyObject())
Run Code Online (Sandbox Code Playgroud)

真正的实现被称为这需要非null参数.

要解决这个问题,要么打开你的类和方法,要么更好的是,SimpleClass改为接受一个接口作为它的构造函数参数并改为模拟接口.

  • @Elye你需要打开Mockito工作的课程和方法 (2认同)