使用 Kotlin 和 Mockito 模拟通用接口(interface)

标签 mocking mockito kotlin

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

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

fun f(x: X<Int>) = x.x()

我可以 mock X具有以下任何一项:

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

    但这会生成“未经检查的转换”警告。

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

    但我不想使用@Mock注释,因为我喜欢将我的字段设置为最终的。

  3. 引入一个辅助函数,如mockito-kotlin library是:

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

    然后这样调用它:

    val x: X<Int> = mock()

    但我不想使用辅助函数。

是否有一种优雅的纯 Kotlin 方式来使用 Mockito 模拟通用接口(interface)? (我更喜欢没有警告的 1. 版本。)

最佳答案

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

更新。要处理“未检查的强制转换”,请使用 Reified type parameters .

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

关于使用 Kotlin 和 Mockito 模拟通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40495622/

相关文章:

javascript - Node.js - 模拟 promise 的结果

groovy - Groovy 中没有参数的模拟静态方法

java - 对单元测试 DAO 的疑问

java - 如何模拟已注入(inject)依赖项的父类(super class)

android - Runnable 未在 Android 上的 float 操作栏上运行

java - 在 RxJava2 中使用背压将 Observable 转换为 Flowable

android - onCreate 在抽象父 Activity 中没有在 kotlin 中调用

node.js - 嵌入在 Node.js 中的 Elasticsearch

unit-testing - 模拟 addProvider(Class<?> klass)

python - 在 autospeccing 时模拟 side_effect 为函数提供额外的参数