assertEquals(Object, Object)
dari JUnit4 / JUnit 5 atau assertThat(actual, is(expected));
dari Hamcrest yang diusulkan dalam jawaban lain hanya akan berfungsi karena keduanya equals()
dan toString()
ditimpa untuk kelas (dan sangat) dari objek yang dibandingkan.
Itu penting karena tes kesetaraan dalam pernyataan bergantung equals()
dan pesan kegagalan pengujian bergantung pada toString()
objek yang dibandingkan.
Untuk kelas bawaan seperti String
, Integer
dan untuk ... tidak ada masalah karena ini menimpa keduanya equals()
dan toString()
. Jadi sangat valid untuk menegaskan List<String>
atau List<Integer>
dengan assertEquals(Object,Object)
.
Dan tentang masalah ini: Anda harus menimpa equals()
di kelas karena masuk akal dalam hal kesetaraan objek, tidak hanya untuk membuat pernyataan lebih mudah dalam ujian dengan JUnit.
Untuk membuat pernyataan lebih mudah, Anda memiliki cara lain.
Sebagai praktik yang baik saya mendukung perpustakaan pernyataan / pencocokan.
Berikut ini adalah solusi AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
adalah apa yang Anda butuhkan: itu memverifikasi bahwa grup yang sebenarnya berisi persis nilai yang diberikan dan tidak ada yang lain, agar seperti yang dinyatakan dalam javadoc.
Misalkan Foo
kelas tempat Anda menambahkan elemen dan di mana Anda bisa mendapatkannya.
Tes unit Foo
yang menyatakan bahwa kedua daftar memiliki konten yang sama dapat terlihat seperti:
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
Poin bagus AssertJ adalah bahwa menyatakan List
seperti yang diharapkan tidak perlu: itu membuat pernyataan menjadi lebih lurus dan kode lebih mudah dibaca:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Tapi perpustakaan Penegasan / pencocokan adalah suatu keharusan karena ini akan sangat jauh.
Misalkan sekarang yang Foo
tidak menyimpan instance String
tetapi Bar
s.
Itu adalah kebutuhan yang sangat umum. Dengan Assert, pernyataan itu masih mudah ditulis. Lebih baik Anda dapat menyatakan bahwa konten daftar sama bahkan jika kelas elemen tidak menimpa equals()/hashCode()
sementara cara JUnit mengharuskan:
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEquals
saat ini. Gunakan dalam kombinasi denganList#toArray
.