模拟与Kotlin和Mockito的接口

时间:2016-12-28 21:32:00

标签: mockito kotlin

我不太了解Kotlin中的界面嘲笑。我不确定这是否是Kotlin特定的或者也适用于java。到目前为止,我只在Kotlin尝试过。

我有一个带接口的模拟类:

val mockObj = mock(MyClass::class.java, withSettings().extraInterfaces(IMyInterface::class.java)

现在,这会在IntelliJ中产生以下问题:

`when`(mockObj.someMethod()).thenReturn(0.1)

someMethod()红色(我认为这取决于配色方案,但您明白了 - 一个问题:未解析的参考

要解决这个问题,我只需在它之前加上这一行:

val mockInterface = mockObj as IMyInterface

mockInterface将以灰色方式加下划线,因为它从未使用过。我仍然使用mockObj作为when

但是,这会使红色消失

我不确定为什么这样有效......有人可以解释这个理论吗?

要删除灰色下划线,然后删除val mockInterface =

所以我的魔术线减少到mockObj as IMyInterface

1 个答案:

答案 0 :(得分:4)

mock(MyClass::class.java)的返回类型为MyClass。返回的对象也是IMyInterface的一个实例,因为你问过Mockito,但Kotlin编译器无法知道。

mockObj as IMyInterface告诉Kotlin编译器将mockObj强制转换为IMyInterface。由于Kotlin编译器支持smart casts,它知道如果此行不抛出任何异常,则mockObj是IMyInterface的实例。因此,它允许您调用someMethod(),并为您插入必要的演员表。

您可以使用更简单的示例复制此内容:

val foo: Any = "hello"
val bar = foo as String
println(foo.length) // smart cast added here

您还可以使用is运算符使编译器插入智能转换

val foo: Any = "hello"
if (foo is String) {
    println(foo.length) // smart cast added here
}