2016-11-08 105 views
2

我想嘲笑使用Mockito的Kotlin的通用接口。但到目前为止,我没有找到自然的解决办法。鉴于:嘲笑Kotlin和Mockito的通用接口

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

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

我可以嘲笑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的通用接口? (我宁愿1的版本没有警告。)

+0

为什么你不想使用帮助函数? 'val x = f(模拟>())'有什么问题? – mfulton26

+0

因为它感觉就像是一个解决方法,用于“未经检查的转换”问题。有没有办法解决这个问题? – jhunovis

+1

我没有看到[reified type parameters](https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters)作为解决“未检查转换”问题的解决方法。实际上,我将“未经检查的转换”问题看作是(Java)解决方法,不具有通用类型参数(或类似的东西)。 – mfulton26

回答

2

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

Upd。为了处理“不加键演员”,使用Reified type parameters

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

+0

我确实使用该库,但这不是问题。我确实想知道是否有一种更直接的方式解决“未经检查的投射”警告。 – jhunovis

+0

我想我明白了。这不是Kotlin的问题,而是用Java编写的Mockito接口,无法表达这一点。如果Mockito会使用物化类型参数,一切都会好的。 – jhunovis