これは、ソースではなくバイトコードを変更する PIT の結果です。
for each ループのバイトコードは次のようになります。
INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator;
ASTORE 2
L2
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext ()Z
IFEQ L3
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;
<contents of the loop>
GOTO L2
L3
したがって、基本的には舞台裏でイテレータを作成し、hasNext の値をチェックしています。それは本当ですが、L2 にジャンプしてループを実行します。
条件付きミューテーションは、hasNext の戻りコードをチェックしてループを終了する IFEQ L3 呼び出しに対するものです。
for each ループで生成された条件文を PIT で検出できればいいのですが。この特定のケースを見たことがあるかどうかはわかりませんが、一般に、言語機能によって生成されたバイトコードと、開発者が記述したコードに直接マップするバイトコードを区別することは困難または不可能です。
更新 - 1.2.5 の時点で、pitest は for each ループで条件を変更しないようにする必要があります。