2012-04-09 32 views
7

Trong thử nghiệm jUnit, tôi muốn lấy một số hàng từ cơ sở dữ liệu dựa trên cột name. Sau đó tôi muốn kiểm tra các hàng mà tôi nhận được có tên tôi mong đợi. Tôi có những điều sau đây:jUnit và ổi, so sánh danh sách bình đẳng sau khi biến đổi()

Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture", 
    "audio equipment"); 
Collection<String> namesToGet = Collections2.transform(typesToGet, 
    new NameFunction<MyClass, String>()); 
List<MyClass> typesGotten = _svc.getAllByName(typesToGet); 
assertThat(typesGotten.size(), is(typesToGet.size())); 
Collection<String> namesGotten = Collections2.transform(typesGotten, 
    new NameFunction<ItemType, String>()); 
assertEquals(namesToGet, namesGotten); // fails here 

Tôi hiện được thất bại này:

java.lang.AssertionError: expected: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]> but was: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]>

Vì vậy, cách ngắn gọn nhất sạch nhất để thử nghiệm mà tôi có hàng trở lại từ cơ sở dữ liệu mà name cột là những gì phù hợp với tên tôi nói tôi muốn? Tôi có thể có một vòng lặp for lặp đi lặp lại và kiểm tra xem mỗi tên trong một danh sách có tồn tại trong danh sách khác không, nhưng tôi đã hy vọng ngắn gọn hơn. Một cái gì đó giống như mã giả sau đây sẽ được tốt đẹp:

List<MyClass> typesGotten = ...; 
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName())) 

Trả lời

15

Bạn có thể sử dụng containsAll() hai lần để kiểm tra xem bạn không có bất kỳ giá trị thiếu hoặc bất kỳ giá trị bất ngờ.

assertTrue(namesToGet.containsAll(namesGotten)); 
assertTrue(namesGotten.containsAll(namesToGet)); 

Nhưng nếu bạn quyết định sử dụng List hoặc Set thay vì Collection, hợp đồng giao diện xác định rằng một List bằng một List (same for Set) iff both contains the same values.

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null : e1.equals(e2)) .) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.


Resources:

6

Nếu bạn expe ct chúng để chứa các phần tử giống nhau, nhưng không nhất thiết phải theo cùng một thứ tự, sau đó chỉ cần thực hiện một bản sao của cả hai và kiểm tra xem các bộ đó có bằng nhau hay không. Nếu bạn mong đợi họ có cùng một thứ tự, hãy làm ImmutableList bản sao và kiểm tra xem chúng có bình đẳng không.

Collection thực sự không có bất kỳ khái niệm bình đẳng nào cả.

6

Cách neatest và biểu cảm nhất của văn bản như một sự khẳng định là với một khớp hamcrest:

assertThat(namesGotten, containsInAnyOrder(namesToGet)) 
+0

Tôi nghĩ rằng tôi đã tìm thấy 'containsInAnyOrder' được mô tả trên http://www.jarvana.com/jarvana/view/org/hamcrest/hamcrest-library/1.2.1/hamcrest-library-1.2.1-javadoc .jar! /org/hamcrest/Matchers.html nhưng tôi không thấy tài liệu về nó. Bạn có biết nếu nó xác nhận hai bộ sưu tập có cùng kích cỡ, bộ sưu tập 1 không có gì ngoài các mục được tìm thấy trong bộ sưu tập 2 và bộ sưu tập 2 không có gì ngoài các mục được tìm thấy trong bộ sưu tập 1? –

+2

Tài liệu của Hamcrest thiếu một chút trong lĩnh vực này, vì vậy bạn nên thử một vài người chơi để thuyết phục bản thân rằng họ đang làm đúng. Ngoài ra, mã nguồn có tại http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java ? r = 480. Có, nó kiểm tra rằng bộ sưu tập 1 có tất cả các thành phần của bộ sưu tập 2, và ngược lại, và do đó chúng có cùng kích thước. – Kkkev

3

Ổi có một phương pháp mà tôi tìm thấy liên kết chặt chẽ các khái niệm bạn đang cố gắng để có được: symmetricDifference. Nếu symmetricDifference rỗng, các bộ sẽ bằng nhau.

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty()); 

Nó có thể không phải là "rẻ nhất", vì nó thực hiện công đoàn, giao lộ và hoạt động khác biệt. Bạn cũng có thể kiểm tra xem các bộ có cùng kích thước không - chúng không chứa các phần tử giống nhau, trong khi chúng có, bạn có thể xác minh rằng (không đối xứng) difference trống.

assertEquals(namesToGet.size(), namesGotten.size()); 
assertTrue(Sets.difference(namesToGet, namesGotten)); 
Các vấn đề liên quan