簡體   English   中英

Jacoco 在與 Kotlin 的貓王接線員進行安全通話時缺少分支

[英]Jacoco has a missing branch on a safe call with an elvis operator in Kotlin

這是一些代碼:

data class House(val line1: String)
data class Street(val house: House)
fun mapCheck(key : String) : House {

    val map = mapOf("A" to Street(House("10 London Road")))

    val street = map[key]
    return street?.house ?: throw IllegalArgumentException("unknown key")

}

這是一個測試(使用Kotest和Junit 5)

 @Test
fun mapTest() {
    val factory = dpsServiceFactory()
    factory.mapCheck("A").line1 shouldBe "10 London Road"
    shouldThrow<java.lang.IllegalArgumentException> { factory.mapCheck("V")  }
}

對於這條線return street?.house?: throw IllegalArgumentException("unknown key")我的 jacoco 覆蓋率報告說我只覆蓋了 4 個條件中的 3 個。

我對此感到困惑。 我只能看到兩個條件,我在測試中滿足的兩個條件。 我不測試的條件是什么?

我已經用JaCoCo: 0.8.8, Kotest: 5.1.0, Kotlin: 1.6.10, JDK: 11.0.12測試了你的代碼。 報告顯示所有 4 個分支都覆蓋了 100%。 您的測試應涵蓋所有情況。 我不知道為什么我們的結果不同。

JaCoCo 分行

“JaCoCo 還計算所有ifswitch語句的分支覆蓋率。該指標計算方法中此類分支的總數,並確定執行或錯過的分支的數量。”

https://www.eclemma.org/jacoco/trunk/doc/counters.html

*您的測試代碼是*

return street?.house ?: throw IllegalArgumentException("unknown key")

當我們反編譯它時,它會像下面的代碼。

if (street != null) { // Branch (1)
     House var10000 = street.getHouse();
     if (var10000 != null) { // Branch (3)
            return var10000;
     } 
     else { // Branch (4)
     }
}
else { // Branch (2)
}

throw (Throwable)(new IllegalArgumentException("unknown key"));

JaCoCo 計算所有分支和所有丟失的分支。 空的else分支不被視為遺漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM