CollectionAssert trong jUnit?


Câu trả lời:


125

Sử dụng JUnit 4.4, bạn có thể sử dụng assertThat()cùng với mã Hamcrest (đừng lo lắng, nó được vận chuyển cùng với JUnit, không cần bổ sung .jar) để tạo ra các xác nhận tự mô tả phức tạp bao gồm các xác nhận hoạt động trên bộ sưu tập:

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

Sử dụng cách tiếp cận này, bạn sẽ tự động nhận được mô tả tốt về xác nhận khi nó không thành công.


1
Ồ, tôi đã không nhận ra rằng hamcrest đã lọt vào bản phát hành junit. Đi đi Nat!
skaffman

Nếu tôi muốn khẳng định l bao gồm các mục ("foo", "bar"), nhưng không có mục nào khác tồn tại - có một số cú pháp dễ dàng cho điều đó không?
ripper234

Sử dụng đoạn mã trên và ném vào một assertTrue bổ sung (l.size () == 2)
aberrant80

4
Meh, xấu xa. Trong NUnit đó là CollectionAssert.AreEqual (Bộ sưu tập dự kiến, Bộ sưu tập thực tế);
ripper234

1
Google đã tìm thấy một câu trả lời Stackoverflow khác mà tôi đang tìm kiếm!
Mykola Golubyev

4

Không trực tiếp, không. Tôi đề xuất sử dụng Hamcrest , cung cấp một bộ quy tắc đối sánh phong phú, tích hợp độc đáo với jUnit (và các khuôn khổ thử nghiệm khác)


Điều này không biên dịch vì một số lý do (xem stackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> real = new ArrayList <Integer> (); ArrayList <Integer> dự kiến ​​= new ArrayList <Integer> (); thực tế.add (1); dự kiến.add (2); khẳng địnhThat (thực tế, hasItems (dự kiến));
ripper234


2

Giải pháp của Joachim Sauer rất hay nhưng không hiệu quả nếu bạn đã có một loạt các kỳ vọng mà bạn muốn xác minh nằm trong kết quả của bạn. Điều này có thể xuất hiện khi bạn đã có một kỳ vọng đã tạo hoặc không đổi trong các bài kiểm tra của mình mà bạn muốn so sánh với một kết quả hoặc có lẽ bạn có nhiều kỳ vọng mà bạn mong đợi được hợp nhất trong kết quả. Vì vậy, thay vì sử dụng các trình so khớp, bạn có thể chỉ cần sử dụng List::containsAllassertTrueVí dụ:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

Bạn luôn có thể sử dụng hasItems(expected1.toArray(new String[expected1.size()])). Nó sẽ cung cấp cho bạn những thông báo thất bại tốt hơn.
meustrus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.