2016-12-28 5 views
1

Ich verstehe nicht wirklich Interface Spott in Kotlin. Ich bin mir nicht sicher, ob dies Kotlin spezifisch ist oder auch auf Java zutrifft. Bisher habe ich es nur in Kotlin probiert.Mocking Interfaces mit Kotlin und Mockito

ich verspottet Klasse mit Schnittstellen haben:

val mockObj = mock(MyClass::class.java, withSettings().extraInterfaces(IMyInterface::class.java) 

jetzt ergibt das folgende Problem in IntelliJ:

`when`(mockObj.someMethod()).thenReturn(0.1) 

die someMethod() wird rot (ich nehme an, dies auf das hängt Farbschema, aber Sie bekommen die Idee - ein Problem: ungelösten Referenz)

dieses Problem zu lösen, schließe ich einfach diese Zeile, bevor es:

val mockInterface = mockObj as IMyInterface 

die mockInterface grau squigly sein wird unterstrichen, weil es ist nie benutzt. Ich benutze immer noch mockObj für die when

aber dies der rot disappear

Ich bin nicht sicher macht, warum das funktioniert ... kann jemand die Theorie erklären?

der grauen unterstreichen, um loszuwerden, entferne ich dann val mockInterface =

so ist meine magische Linie mockObj as IMyInterface

+0

sein absolut klar, der Grund, warum ich‘ Ich bin verwirrt, weil ich eine neue Variable erstellt habe, die ich nie benutzt habe - um das Problem zu lösen ... und noch verwirrender, habe ich dann die linke Hand der Aufgabe entfernt und sie funktioniert immer noch! – ycomp

Antwort

4

Der Rückgabetyp mock(MyClass::class.java) ist MyClass zu reduziert. Das zurückgegebene Objekt ist auch eine Instanz von IMyInterface, da Sie das an Mockito gestellt haben, aber der Kotlin-Compiler kann das nicht wissen.

mockObj as IMyInterface teilt dem Kotlin-Compiler mit, mockObj in IMyInterface zu konvertieren. Da der Kotlin-Compiler smart casts unterstützt, weiß er, dass mockObj eine Instanz von IMyInterface ist, wenn diese Zeile keine Ausnahme auslöst. Und so können Sie someMethod() anrufen und fügt die erforderliche Besetzung für Sie ein.

Sie diese mit einem einfacheren Beispiel replizieren können:

val foo: Any = "hello" 
val bar = foo as String 
println(foo.length) // smart cast added here 

Sie auch die is Operator verwenden könnte der Compiler, um eine intelligente Gießeinsetzbauteils

val foo: Any = "hello" 
if (foo is String) { 
    println(foo.length) // smart cast added here 
} 
+0

ah, habe es - danke – ycomp

+0

p.s. es in 'is' zu ändern und das einer Variablen zuzuweisen funktioniert bei mir nicht - aber 'as' ist gut genug – ycomp

Verwandte Themen