Optionalを使うとカバレッジ率が上がる!

カバレッジ率について実験してみる

カバレッジ率が微妙なコード

まず例題としてこんなコードがあるとする
Hoge.java

public class Hoge {
    public static String getOrNull(String str) {
        if(str == null) {
            return "null";
        }
        return str;
    }
}

HogeTest.java

public class HogeTest {
    @Test
    public void getOrNull() {
        assert Hoge.getOrNull("hello") == "hello";
    }
}

このテストはgetOrNull()にnullを入れるケースがないのでカバレッジ率は100%になりません
実際に実行するとカバレッジ率は66%になりました

Optionalで書いてみる

プロダクトコードでnullチェックするのはかっこ悪いのでOptionalで書いてみます
Hoge.java

public class Hoge {
    public static String getOrNull(Optional<String> str) {
        return str.orElse("null");
    }
}

HogeTest.java

public class HogeTest {
    @Test
    public void getOrNull() {
        assert Hoge.getOrNull(Optional.of("hello")) == "hello";
    }
}

このテストも先ほどと同じくnullのケースがありませんが
カバレッジ率を測ってみると
100%!!!
うげ。。

Optionalが絡むとカバレッジ率が信用ならない

どうすんのこれ。。

orElseGet()にしてみる

orElseGet()なら引数が関数なのでちゃんと実行をカウントしてくれそうなのでやってみる
Hoge.java

public class Hoge {
    public static String getOrNull(Optional<String> str) {
        return str.orElseGet(()->"null");
    }
}

実行するとカバレッジ率が50%になった!

まとめ

モダンな書き方はカバレッジ率との相性が悪い
まぁ関数型を使うようにすれば良くはなるけど...
つらい...