web-dev-qa-db-ja.com

JUnitアサーションの配列を比較する、簡潔な組み込み方法?

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]);

..しかし、もっと良い方法はありますか?

136
mBria

org.junit.Assert のメソッドassertArrayEqualsを使用します。

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

このメソッドを使用できない場合、junit.frameworkからAssertクラスを誤ってインポートした可能性があります。

260
Andy Thomas

Arrays.equals(..)を使用できます:

assertTrue(Arrays.equals(expectedResult, result));
34
Bozho

私は配列を文字列に変換することを好みます:

Assert.assertEquals(
                Arrays.toString(values),
                Arrays.toString(new int[] { 7, 8, 9, 3 }));

これにより、間違った値がどこにあるかを明確に確認できます。これは小さなサイズの配列に対してのみ効果的に機能しますが、ユニットテストで7個を超えるアイテムを持つ配列を使用することはほとんどありません。

このメソッドは、toStringのオーバーロードがすべての重要な情報を返す場合、プリミティブ型およびその他の型に対して機能します。

15
csharpfolk
10

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>]
3
winstanr

私は質問がJUnit4に対するものであることを知っていますが、もしあなたがJUnit3で動けなくなったら、そのような短いユーティリティ関数を作成することができます:

private void assertArrayEquals(Object[] esperado, Object[] real) {
    assertEquals(Arrays.asList(esperado), Arrays.asList(real));     
}

JUnit3では、これは配列を直接比較するよりも優れています。どの要素が異なるかを正確に詳述するからです。

2
Haroldo_OK