嘲笑与Kotlin和Mockito的接口

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

模拟接口将被灰色下划线,因为它从来没有使用过 。 我仍然使用mockObjwhen

然而,这使得红色消失

我不知道为什么这个作品…有人可以解释这个理论吗?

为了摆脱灰色的下划线,我然后删除val mockInterface =

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

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

mockObj as IMyInterface告诉Kotlin编译器将mockObj转换为IMyInterface。 由于Kotlin编译器支持智能转换 ,因此它知道如果该行不抛出任何异常,则mockObjmockObj的一个实例。 因此它可以让你调用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 }