Bagaimana Anda secara ringkas menegaskan persamaan Collection
elemen, khususnya a Set
di JUnit 4?
Bagaimana Anda secara ringkas menegaskan persamaan Collection
elemen, khususnya a Set
di JUnit 4?
Jawaban:
Anda dapat menyatakan bahwa keduanya Set
sama satu sama lain, yang memanggil Set
equals()
metode tersebut .
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
Ini @Test
akan lolos jika keduanya Set
berukuran sama dan mengandung elemen yang sama.
equals
dan hashCode
menerapkan di kelas yang Anda simpan di Hashtable Anda?
Apache bersiap untuk menyelamatkan lagi.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Bekerja seperti pesona. Saya tidak tahu mengapa tetapi saya menemukan bahwa dengan koleksi berikut assertEquals(coll1, coll2)
ini tidak selalu berfungsi. Dalam kasus di mana gagal untuk saya, saya memiliki dua koleksi yang didukung oleh Sets. Baik hamcrest maupun junit tidak akan mengatakan bahwa koleksinya sama meskipun saya tahu pasti itu sama. Menggunakan CollectionUtils bekerja dengan sempurna.
dengan hamcrest :
assertThat(s1, is(s2));
dengan pernyataan sederhana:
assertEquals(s1, s2);
NB: t metode equals () dari kelas himpunan beton digunakan
Kasus yang sangat menarik adalah saat Anda membandingkan
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
dan
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Sejauh ini, satu-satunya solusi yang saya lihat adalah mengubah keduanya menjadi set
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Atau saya bisa membandingkannya elemen demi elemen.
Sebagai metode tambahan yang berbasis array ... Anda dapat mempertimbangkan untuk menggunakan pernyataan array tak berurutan di junitx. Meskipun contoh Apache CollectionUtils akan berfungsi, ada juga paket ekstensi pernyataan yang solid di sana:
Saya pikir itu
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
pendekatan akan jauh lebih mudah dibaca dan di-debug untuk Anda (semua Koleksi mendukung toArray (), jadi seharusnya cukup mudah untuk menggunakan metode ArrayAssert.
Tentu saja kekurangannya di sini adalah, junitx adalah file jar tambahan atau entri maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Lihat artikel ini . Satu contoh dari sana:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Menggunakan Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Ini juga berfungsi ketika set memiliki tipe data yang berbeda, dan melaporkan perbedaannya, bukan hanya gagal.
Jika Anda ingin memeriksa apakah Daftar atau Kumpulan berisi sekumpulan nilai tertentu (alih-alih membandingkannya dengan koleksi yang sudah ada), seringkali metode koleksi toString berguna:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Ini sedikit lebih pendek daripada membuat koleksi yang diharapkan dan membandingkannya dengan koleksi sebenarnya, dan lebih mudah untuk menulis dan mengoreksi.
(Memang, ini bukan metode yang sangat bersih, dan tidak dapat membedakan elemen "foo, bar" dari dua elemen "foo" dan "bar". Namun dalam praktiknya, menurut saya yang paling penting adalah menulis tes yang mudah dan cepat , jika tidak, banyak pengembang tidak mau tanpa dipaksa.)
Saya suka solusi dari Hans-Peter Störr ... Tapi menurut saya itu tidak sepenuhnya benar. Sayangnya containsInAnyOrder
tidak menerima Collection
keberatan untuk dibandingkan. Jadi itu harus Collection
dari Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Impornya adalah:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;