Membandingkan array dalam pernyataan JUnit, cara built-in yang ringkas?


159

Apakah ada cara ringkas dan built-in untuk melakukan pernyataan yang setara pada dua array yang diketik seperti di JUnit? Secara default (setidaknya dalam JUnit 4) tampaknya melakukan perbandingan contoh pada objek array itu sendiri.

EG, tidak berfungsi:

int[] expectedResult = new int[] { 116800,  116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);

Tentu saja, saya bisa melakukannya secara manual dengan:

assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
    assertEquals("mismatch at " + i, expectedResult[i], result[i]);

..tapi apakah ada cara yang lebih baik?

Jawaban:


298

Gunakan metode org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Jika metode ini tidak tersedia, Anda mungkin secara tidak sengaja mengimpor kelas Assert dari junit.framework.


tetapi semua yang Anda dapatkan ketika gagal untuk panjang yang berbeda adalah java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Seperti kebanyakan pesan kegagalan JUnit, itu tidak begitu membantu ... Saya menyarankan menggunakan beberapa kerangka kerja penegasan
user1075613

1
@ user1075613 - Saya merasa terbantu. Kami menegaskan bahwa array sama, mereka tidak, dan kami diberi indikasi mengapa. Dari sana, kita dapat mengatur breakpoint, dan memeriksa array secara detail.
Andy Thomas

1
benar, ini - sedikit - membantu. Namun saat Anda menunjukkannya, saat Anda memiliki pesan ini, Anda bertanya pada diri sendiri, "Mengapa panjangnya tidak sama?" jadi Anda ingin memeriksa konten. Mengapa kehilangan waktu dengan debugger ketika pesan kesalahan yang bagus bisa langsung tahu? (tentu saja Anda masih membutuhkan debugger tetapi sebagian besar waktu tidak)
user1075613

Anda dapat mengirimkan masalah ke sistem pelacakan masalah JUnit . Ingatlah, bahwa 1) gagal cepat, dalam O (1), bisa menjadi keuntungan, 2) output kegagalan pernyataan tidak boleh O (n). Sistem pelacakan masalah JUnit adalah forum yang lebih baik untuk diskusi lebih lanjut.
Andy Thomas

1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas

35

Anda bisa menggunakan Arrays.equals(..):

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

14
Apa yang buruk tentang itu adalah Anda tidak mendapatkan data tentang apa yang salah ketika gagal.
mBria

8
Bagus saat Anda menggunakan versi junit yang lebih lama (seperti pada Android)
Zitrax

2
Jika Anda ingin melihat byte mana yang tidak cocok, Anda dapat mengubahnya menjadi string: assertEquals (Arrays.toString (expectedResult), Arrays.toString (hasil));
Erdem

17

Saya lebih suka mengonversi array ke string:

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

dengan cara ini saya bisa melihat dengan jelas di mana nilai-nilai yang salah. Ini bekerja secara efektif hanya untuk array berukuran kecil, tetapi saya jarang menggunakan array dengan lebih banyak item daripada 7 dalam tes unit saya.

Metode ini berfungsi untuk tipe primitif dan untuk tipe lainnya ketika kelebihan toStringpengembalian semua informasi penting.



4

Menggunakan junit4 dan Hamcrest Anda mendapatkan metode ringkas untuk membandingkan array. Itu juga memberikan rincian di mana kesalahan berada di jejak kegagalan.

import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;

//...

assertThat(result, is(new int[] {56, 100, 2000}));

Output Jejak Kegagalan:

java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]

2

Saya tahu pertanyaannya adalah untuk JUnit4, tetapi jika Anda terjebak di JUnit3, Anda dapat membuat fungsi utilitas pendek seperti itu:

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

Dalam JUnit3, ini lebih baik daripada langsung membandingkan array, karena akan merinci elemen mana yang berbeda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.