【发布时间】:2016-11-08 20:15:24
【问题描述】:
我正在尝试使用 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 library 所做的那样:
inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java)!!然后这样称呼它:
val x: X<Int> = mock()但我不想使用辅助函数。
是否有一种优雅的纯 Kotlin 方式来模拟使用 Mockito 的通用接口? (我更喜欢没有警告的 1. 版本。)
【问题讨论】:
-
为什么不想使用辅助函数?
val x = f(mock<X<Int>>())有什么问题? -
因为它感觉像是解决“未经检查的演员表”问题的一种解决方法。有没有办法在没有解决方法的情况下做到这一点?
-
我不认为 reified type parameters 可以解决“未经检查的演员表”问题。事实上,我将“未经检查的强制转换”问题视为(Java)解决方法,以解决没有具体类型参数(或类似的东西)。
-
@mfulton26 想了想,我完全同意你的看法!