Làm thế nào bạn có thể khẳng định một cách ngắn gọn sự bình đẳng của Collection
các phần tử, cụ thể là a Set
trong JUnit 4?
Làm thế nào bạn có thể khẳng định một cách ngắn gọn sự bình đẳng của Collection
các phần tử, cụ thể là a Set
trong JUnit 4?
Câu trả lời:
Bạn có thể khẳng định rằng hai Set
s bằng nhau, điều này gọi ra Set
equals()
phương thức .
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 );
}
}
Điều này @Test
sẽ vượt qua nếu hai Set
s có cùng kích thước và chứa các phần tử giống nhau.
equals
và hashCode
triển khai trong lớp mà bạn đang lưu trữ trong Hashtable không?
Apache lại tham gia giải cứu.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Hoạt động như một sự quyến rũ. Tôi không biết tại sao nhưng tôi thấy rằng với các bộ sưu tập sau đây assertEquals(coll1, coll2)
không phải lúc nào cũng hoạt động. Trong trường hợp nó không thành công với tôi, tôi có hai bộ sưu tập được hỗ trợ bởi Bộ. Cả hamcrest và junit đều không nói rằng các bộ sưu tập là bằng nhau mặc dù tôi biết chắc rằng chúng là như vậy. Sử dụng CollectionUtils nó hoạt động hoàn hảo.
với hamcrest :
assertThat(s1, is(s2));
với khẳng định rõ ràng:
assertEquals(s1, s2);
NB: t phương thức equals () của lớp tập hợp cụ thể được sử dụng
Một trường hợp đặc biệt thú vị là khi bạn so sánh
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
và
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Cho đến nay, giải pháp duy nhất mà tôi thấy là thay đổi cả hai thành bộ
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Hoặc tôi có thể so sánh chúng từng phần tử.
Là một phương thức bổ sung dựa trên mảng ... bạn có thể xem xét sử dụng xác nhận mảng không có thứ tự trong junitx. Mặc dù ví dụ Apache CollectionUtils sẽ hoạt động, nhưng cũng có một loạt các phần mở rộng khẳng định chắc chắn ở đó:
Tôi nghĩ rằng
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
phương pháp tiếp cận sẽ dễ đọc và dễ gỡ lỗi hơn cho bạn (tất cả các Bộ sưu tập đều hỗ trợ toArray (), vì vậy sẽ đủ dễ dàng để sử dụng các phương thức ArrayAssert.
Tất nhiên nhược điểm ở đây là, junitx là một tệp jar bổ sung hoặc mục nhập maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Kiểm tra bài viết này . Một ví dụ từ đó:
@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);
}
Sử dụng Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Điều này cũng hoạt động khi các tập hợp có kiểu dữ liệu khác nhau và báo cáo về sự khác biệt thay vì chỉ bị lỗi.
Nếu bạn muốn kiểm tra xem một Danh sách hoặc Tập hợp có chứa một tập hợp các giá trị cụ thể hay không (thay vì so sánh nó với một tập hợp đã tồn tại), thì phương thức toString của các tập hợp thường rất hữu ích:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Điều này ngắn hơn một chút so với lần đầu tiên xây dựng bộ sưu tập dự kiến và so sánh nó với bộ sưu tập thực tế, đồng thời dễ viết và sửa hơn.
(Phải thừa nhận rằng đây không phải là một phương pháp đặc biệt rõ ràng và không thể phân biệt một phần tử "foo, bar" với hai phần tử "foo" và "bar". Nhưng trên thực tế, tôi nghĩ điều quan trọng nhất là viết test dễ dàng và nhanh chóng , nếu không, nhiều nhà phát triển sẽ không bị thúc ép.)
Tôi thích giải pháp của Hans-Peter Störr ... Nhưng tôi nghĩ nó không hoàn toàn chính xác. Đáng buồn là containsInAnyOrder
không chấp nhận một Collection
trong số các tài liệu để so sánh với. Vì vậy, nó phải là một Collection
trong số Matcher
:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Nhập khẩu là:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;