2016-12-28 68 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