2016-12-28 165 views
1

我不太了解Kotlin的接口嘲讽。我不确定这是Kotlin特有还是适用于Java。到目前为止,我只在Kotlin尝试过。嘲笑Kotlin和Mockito的接口

我有一个接口嘲笑类:

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将是灰色squigly强调,因为它是从未使用过。我仍然使用mockObjwhen

然而,这使得红色消失

我不知道为什么这个工程......有人可以解释的理论?

摆脱灰色下划线的,我再取出val mockInterface =

所以我的魔线降低到mockObj as IMyInterface

+0

是绝对清楚的,我的理由m confused是_因为我创建了一个我从来没有用过的新变量 - 为了解决这个问题......而且更令人困惑的是,我删除了作业的左手,它仍然有效! – ycomp

回答

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 
} 
+0

啊,明白了 - 谢谢 – ycomp

+0

p.s.将它更改为'is'并将其分配给一个变量对我来说不起作用 - 但'as'已经足够好了 – ycomp