JUnitの2つの類似した型の配列に対して同等のアサーションを実行する簡潔で組み込みの方法はありますか?デフォルトでは(少なくともJUnit 4では)、配列オブジェクト自体でインスタンス比較を行うようです。
EG、動作しません:
int[] expectedResult = new int[] { 116800, 116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);
もちろん、私は手動でそれを行うことができます:
assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
assertEquals("mismatch at " + i, expectedResult[i], result[i]);
..しかし、もっと良い方法はありますか?
org.junit.Assert のメソッドassertArrayEquals
を使用します。
import org.junit.Assert;
...
Assert.assertArrayEquals( expectedResult, result );
このメソッドを使用できない場合、junit.framework
からAssertクラスを誤ってインポートした可能性があります。
Arrays.equals(..)
を使用できます:
assertTrue(Arrays.equals(expectedResult, result));
私は配列を文字列に変換することを好みます:
Assert.assertEquals(
Arrays.toString(values),
Arrays.toString(new int[] { 7, 8, 9, 3 }));
これにより、間違った値がどこにあるかを明確に確認できます。これは小さなサイズの配列に対してのみ効果的に機能しますが、ユニットテストで7個を超えるアイテムを持つ配列を使用することはほとんどありません。
このメソッドは、toString
のオーバーロードがすべての重要な情報を返す場合、プリミティブ型およびその他の型に対して機能します。
Junit4と Hamcrest を使用すると、配列を比較する簡潔な方法が得られます。また、エラーが障害トレースのどこにあるかの詳細も提供します。
import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;
//...
assertThat(result, is(new int[] {56, 100, 2000}));
障害トレース出力:
Java.lang.AssertionError:
Expected: is [<56>, <100>, <2000>]
but: was [<55>, <100>, <2000>]
私は質問がJUnit4に対するものであることを知っていますが、もしあなたがJUnit3で動けなくなったら、そのような短いユーティリティ関数を作成することができます:
private void assertArrayEquals(Object[] esperado, Object[] real) {
assertEquals(Arrays.asList(esperado), Arrays.asList(real));
}
JUnit3では、これは配列を直接比較するよりも優れています。どの要素が異なるかを正確に詳述するからです。