2016-05-24 7 views
9

ich eine sehr einfache Testfunktion erstellt, wie untenKotlin Inline-Schlüsselwort verursacht IntelliJ IDEA Coverage Berichterstattung 0%

class SimpleClassTest { 

    lateinit var simpleObject: SimpleClass 
    @Mock lateinit var injectedObject: InjectedClass 


    @Before 
    fun setUp() { 
     MockitoAnnotations.initMocks(this) 
    } 

    @Test 
    fun testSimpleFunction() { 
     simpleObject = lookupInstance() 
    } 

    inline fun lookupInstance() = SimpleClass(injectedObject) 
} 

ich laufe mit Coverage ... Die Testabdeckung Nummer 0%. Aber wenn ich das inline Schlüsselwort entferne, zeigt die Testabdeckung jetzt an.

Ist dies ein Problem mit Kotlin oder Android IntelliJ IDEA Coverage? (Hinweis: JaCoco Abdeckung ist gut).

Hinweis: Ich bin mit Android Studio 2.0 und Kotlin 1.0.2

+0

Sie erhalten zufällig eine ArrayIndexOutOfBoundsException in der Testausgabe? – daemontus

Antwort

1

Wenn eine Inline-Funktion kompiliert wird, fügt der Compiler im Wesentlichen seinen Körper in die Aufrufstelle (anstelle der Call-Funktion). Dies bedeutet, dass die Coverage-Analyse nicht erkennen kann, dass es sich um eine Inline-Funktion handelt, da sie nicht wirklich dort existiert, wo Sie sie definiert haben. Mit anderen Worten, dieses Verhalten ist ein natürliches Artefakt dessen, was es bedeutet, dass eine Funktion inline ist.

+0

Es gibt keinen Grund, dass die Abdeckung von anderen alle als null gezählt werden würde, wenn Inline verwendet wird. JaCoco ist in Ordnung, also erklärt das oben nichts. – Elye