我不太了解Kotlin中的接口模拟。我不确定这是特定于Kotlin还是适用于Java。到目前为止,我只在Kotlin尝试过。
我有一个带有接口的模拟类:
val mockObj = mock(MyClass::class.java, withSettings().extraInterfaces(IMyInterface::class.java)
现在,这在Intellij中产生以下问题:
`when`(mockObj.someMethod()).thenReturn(0.1)
someMethod()
将是 red (我认为这取决于配色方案,但是您会得到这个想法 - 一个问题:未解决的参考)
要解决这个问题,我只需在此行之前包括此行:
val mockInterface = mockObj as IMyInterface
模拟接口将是灰色的凸出下划线的,因为它是从未使用过的。我仍然将mockObj
用于when
但是,这使得 red 消失
我不确定为什么这有效...有人可以解释理论吗?
要摆脱灰色下划线,然后删除val mockInterface =
所以我的魔术线简化为 mockObj as IMyInterface
mock(MyClass::class.java)
的返回类型是 MyClass
。返回的对象也是Imyinterface的一个实例,因为您要求摩索哥摩擦,但是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
}