4

ミューテーション テストを少しいじっているだけですが、理解できないことが 1 つあります。次のような for-each ループに常に「否定された条件付きミューテーター」を適用しようとするのはなぜですか。

for (final Order order : orders)

mutator の説明 ( http://pitest.org/quickstart/mutators/#NEGATE_CONDITIONALS!= ) を見ると、 to==<toなどの条件を変更する必要があり>=ます。そのため、なぜそこで使用されているのか、なぜ失敗するのか、しないのかがよくわかりません。

誰か説明してくれませんか?

4

1 に答える 1

6

これは、ソースではなくバイトコードを変更する 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 ループで条件を変更しないようにする必要があります。

于 2016-07-27T09:24:46.590 に答える