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


158

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

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

回答:


296

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

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

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


しかし、それが異なる長さで失敗したときに得られるのはだけjava.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7です。ほとんどのJUnit障害メッセージはそれほど役に立ちません...私はいくつかのアサーションフレームワークを使用することをお勧めします
user1075613

1
@ user1075613-参考になりました。配列は等しいと主張し、それらは等しくなく、その理由を示しました。そこから、ブレークポイントを設定し、配列を詳細に調べることができます。
アンディトーマス

1
右、それは-少し-役に立ちました。しかし、指摘すると、このメッセージが表示された瞬間に、「なぜ同じ長さではないのか」と自問します。内容を確認したい。良いエラーメッセージが直接それを伝えることができるのに、なぜデバッガで時間を失うのですか?(まだデバッガが必要な場合がありますが、ほとんどの場合は不要です)
user1075613

JUnitの課題追跡システムに課題を送信できます。ただし、1)O(1)で高速に失敗することが利点になる場合があること、2)アサーション失敗の出力がO(n)であってはならないことを覚えておいてください。JUnit課題追跡システムは、さらに議論するためのより良いフォーラムです。
アンディ・トーマス

1
@anddero- Assert.assertFalse( Arrays.equals( expectedResult, result ))
アンディトーマス

35

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

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

14
それについて悪臭を放つのは、失敗したときに何が問題だったかについてのデータが得られないことです。
mBria

8
旧バージョンのjunit(Androidなど)を使用している場合に便利
Zitrax

2
一致しないバイトを確認する場合は、それらを文字列に変換できます。assertEquals(Arrays.toString(expectedResult)、Arrays.toString(result));
Erdem

17

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

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

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

このメソッドは、プリミティブ型と、オーバーロードによってtoStringすべての重要な情報が返される他の型に対して機能します。



4

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

2

質問がJUnit4に関するものであることはわかっていますが、JUnit3に行き詰まった場合は、次のような短いユーティリティ関数を作成できます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.