djunitを使用し、カバレッジの試験を実施中のトラブル。
どう考えても処理を通過しているにも関わらず、カバレッジが100%にならない問題が発生しました。
カバレッジ100%にならない処理
該当する処理を簡単に書くと以下のような感じ。
カバレッジ100%にならないソースコードの例
public static void main(String[] args) {
String a = null;
while (true) {
if (a == null) {
break;
}
}
System.out.println();
}
問題の箇所は5行目。
このbreakを通過していないと言われてしまった。
しかし、本当にこの5行目を実行していないのであれば、無限ループに陥っているハズである。
また、この5行目の前に、プリント出力の文を入れると、きちんと出力されるため間違いなく通過している。
カバレッジ100%にならない原因
調査したところ、どうやらコンパイラがコンパイルする際に最適化している関係で、ここの処理が書き変わってしまうようです。
確かに、ブレークポイントを止めてみても、5行目には止まらずにループを抜けています。
コンパイルしたclassファイルを逆コンパイルしても同じことが起きてしまいます。
どうしてもエビデンスとして100%という結果を残したいのであれば、breakの直前に何らかの処理をするしかないようです。
(例えば、最も低いレベルでログを出力するなど)
同様の事象
ちなみに、breakに限らず、continueやfinalyの場合でも同様の事象が発生するようです。
コメント