用Kotlin和Mockito模拟通用接口

jhu*_*vis 5 mocking mockito kotlin

我正在尝试使用Mockito在Kotlin中模拟通用接口。但是到目前为止,我还没有找到自然的解决方案。鉴于:

interface X<T> {
    fun x(): T
}

fun f(x: X<Int>) = x.x()
Run Code Online (Sandbox Code Playgroud)

我可以嘲笑X以下任何一项:

  1. val x = f(Mockito.mock(X::class.java) as X<Int>)

    但这会产生“未经检查的演员表”警告。

  2. @Mock lateinit var x: X<Int>

    但是我不想使用@Mock注释,因为我想将字段最终确定。

  3. 引入一个辅助函数,就像模仿库库林库所做的那样:

    inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java)!!

    然后这样称呼它:

    val x: X<Int> = mock()

    但是我不想使用辅助函数。

是否有一种优雅的纯Kotlin方法来模拟Mockito的通用接口?(我希望版本1.不带警告。)

Rus*_*lan 5

只需使用mockito-kotlin项目。这个项目包含所有必须有的 mockito 助手。并支持 mockito 2.1。

更新。要处理“uncheked cast”,请使用Reified 类型参数

你说“但我不想使用辅助函数。”,但为什么呢?这是内联函数,因此在编译时函数将在所有调用点内联。