我正在尝试使用 Mockito 模拟 Kotlin 中的通用接口。但到目前为止我还没有找到自然的解决方案。鉴于:
interface X<T> {
fun x(): T
}
fun f(x: X<Int>) = x.x()
我可以嘲笑X
具有以下任何一项:
-
val x = f(Mockito.mock(X::class.java) as X<Int>)
但这会产生“未经检查的演员”警告。
-
@Mock lateinit var x: X<Int>
但我不想使用@Mock
注释,因为我喜欢将我的字段定为最终的。
-
引入一个辅助函数,作为Mockito-Kotlin 库 https://github.com/nhaarman/mockito-kotlin does:
inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java)!!
然后像这样调用它:
val x: X<Int> = mock()
但我不想使用辅助函数。
是否有一种优雅的纯 Kotlin 方式来使用 Mockito 模拟通用接口?
(我更喜欢没有警告的 1. 版本。)
只需使用Mockito-Kotlin https://github.com/nhaarman/mockito-kotlin项目。该项目包含所有mockito 必须有的助手。并且也支持mockito 2.1。
更新。处理“未经检查的演员”使用具体化类型参数 https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters.
你说“但我不想使用辅助函数。”,但为什么呢?这是内联函数,因此在编译时函数将在所有调用站点处内联。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)