我有一個Groovy類與單個靜態方法Groovy代碼:聲納+ JaCoco不計算爲覆蓋
class ResponseUtil {
static String FormatBigDecimalForUI (BigDecimal value){
(value == null || value <= 0) ? '' : roundHalfEven(value)
}
}
它有一個測試用例或幾個:
@Test
void shouldFormatValidValue() {
assert '1.8' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(1.7992311))
assert '0.9' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.872342))
}
@Test
void shouldFormatMissingValue() {
assert '' == ResponseUtil.FormatBigDecimalForUI(null)
}
@Test
void shouldFormatInvalidValue() {
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0))
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.0))
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(-1.0))
}
這導致6/12
分支根據聲納/ JaCoCo覆蓋:
所以我已經將代碼更改爲...詳細。我不認爲原始代碼是「太聰明」或類似的東西,但我更加明確和清晰。所以,在這裏,它是:
static String FormatBigDecimalForUI (BigDecimal value) {
if (value == null) {
''
} else if (value <= 0) {
''
} else {
roundHalfEven(value)
}
}
而現在,而不必改變任何東西,聲納/ JaCoCo報告它被完全覆蓋:
爲什麼會出現這種情況?
我猜這是Sonar/JaCoCo中的一個錯誤,因爲這兩種方法都會產生非常類似的字節碼,據我所見...... –
我已經在Cobertura下運行相同的「代碼覆蓋看起來如何」併產生完全相同的結果。在單線上進行了半測試,並在擴展版本上進行了全面測試。那是......有關。 – Mike
我已經發布了兩個生成的字節碼[這裏](https://gist.github.com/e61f5f41175c6a8e076b),他們看起來沒什麼問題(但顯然多行代碼調用'areturn'比單行版本更)......可能有人在Groovy用戶郵件列表中發現了這個問題(並找到了解決方法)......我會嘗試關閉一封電子郵件,看看有沒有人看到過這個問題? –