4

単一の静的メソッドを持つ Groovy クラスがあります。

class ResponseUtil {
    static String FormatBigDecimalForUI (BigDecimal value){
        (value == null || value <= 0) ? '' : roundHalfEven(value)
    }
}

テスト ケースが 1 つまたはいくつかあります。

@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/12Sonar/JaCoCo に従ってブランチがカバーされます。

半分のコード カバレッジ

そのため、コードをより冗長なものに変更しました。元のコードが「巧妙すぎる」などとは思いませんが、より明示的かつ明確にしました。だから、ここにあります:

static String FormatBigDecimalForUI (BigDecimal value) {
    if (value == null) {
        ''
    } else if (value <= 0) {
        ''
    } else {
        roundHalfEven(value)
    }
}

そして今、他に何も変更することなく、Sonar/JaCoCo はそれを完全にカバーしていると報告しています:

JaCoCo 100% カバレッジ

これはなぜですか?

4

2 に答える 2

3

具体的な例に当てはまるかどうかはわかりませんが、コード カバレッジ ツールは通常、明示的にサポートされていない限り、代替 JVM 言語ではうまく機能しないことに注意してください。これは、これらの言語のほぼすべてが、特定の場合にのみ実行される余分なバイト コードを生成するためです。たとえば、Groovy は低速パスと高速パスのバイト コードを生成し、ユーザーが発言することなく自動的にどちらかを決定する場合があります。

この状況は、Groovy 3.0 で改善される可能性があります。Groovy 3.0 は、Java invokedynamic を中心に設計されます。つまり、「魔法の」バイト コードを生成する必要が少なくなります。一方で、Clover が明示的に Groovy をサポートしていると聞いたことがありますが、最新かどうかはわかりません。

于 2012-06-20T18:13:07.513 に答える