我不太了解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
答案 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
}