assertEquals(Object, Object)
từ JUnit4 / JUnit 5 hoặc assertThat(actual, is(expected));
từ Hamcrest được đề xuất trong các câu trả lời khác sẽ chỉ hoạt động khi cả hai equals()
và toString()
được ghi đè cho các lớp (và sâu) của các đối tượng được so sánh.
Nó quan trọng bởi vì kiểm tra đẳng thức trong khẳng định dựa vào equals()
và thông báo lỗi kiểm tra phụ thuộc vào toString()
các đối tượng được so sánh.
Đối với các lớp dựng sẵn như String
, Integer
và vì vậy ... không có vấn đề gì vì các lớp này ghi đè cả equals()
và toString()
. Vì vậy, nó là hoàn toàn hợp lệ để khẳng định List<String>
hoặc List<Integer>
với assertEquals(Object,Object)
.
Và về vấn đề này: bạn phải ghi đè equals()
trong một lớp vì nó có ý nghĩa về mặt bình đẳng đối tượng, không chỉ giúp cho các xác nhận dễ dàng hơn trong một thử nghiệm với JUnit.
Để làm cho các xác nhận dễ dàng hơn, bạn có những cách khác.
Là một thực hành tốt, tôi ủng hộ các thư viện khẳng định / so khớp.
Đây là một giải pháp AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
là những gì bạn cần: nó xác minh rằng nhóm thực tế chứa chính xác các giá trị đã cho và không có gì khác, theo thứ tự như đã nêu trong javadoc.
Giả sử một Foo
lớp nơi bạn thêm các phần tử và nơi bạn có thể nhận được phần tử đó.
Một bài kiểm tra đơn vị Foo
khẳng định rằng hai danh sách có cùng nội dung có thể trông giống như:
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");
}
Một điểm tốt của AssertJ là việc khai List
báo như mong đợi là không cần thiết: nó làm cho khẳng định trở nên cứng hơn và mã dễ đọc hơn:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Nhưng các thư viện Ass ass / matcher là bắt buộc bởi vì những thư viện này sẽ thực sự xa hơn.
Giả sử bây giờ Foo
không lưu trữ String
s nhưng Bar
s.
Đó là một nhu cầu rất phổ biến. Với AssertJ, khẳng định vẫn đơn giản để viết. Tốt hơn là bạn có thể khẳng định rằng nội dung danh sách là bằng nhau ngay cả khi lớp của các phần tử không ghi đè equals()/hashCode()
trong khi cách JUnit yêu cầu:
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
ngày nay. Sử dụng kết hợp vớiList#toArray
.