2013-03-25 29 views
31

Làm cách nào để kiểm tra việc sử dụng Hamcrest nếu bộ sưu tập nhất định chứa các mặt hàng đã cho theo thứ tự nhất định? Tôi đã thử hasItems nhưng nó chỉ đơn giản là bỏ qua thứ tự.Làm cách nào để kiểm tra xem bộ sưu tập có chứa các mặt hàng theo thứ tự nhất định không bằng cách sử dụng Hamcrest

List<String> list = Arrays.asList("foo", "bar", "boo"); 

assertThat(list, hasItems("foo", "boo")); 

//I want this to fail, because the order is different than in "list" 
assertThat(list, hasItems("boo", "foo")); 
+1

Cân nhắc thay đổi câu trả lời được chấp nhận. Thông thường, khi chúng tôi tìm kiếm một đối sánh, chúng tôi ưu tiên những người đã có trong API, để lại các đối sánh tùy chỉnh với các trường hợp không thể tránh khỏi. – acdcjunior

+0

Bạn nói đúng! Cảm ơn –

+1

Câu trả lời được chấp nhận không trả lời câu hỏi. Câu hỏi yêu cầu một người đấu giá chỉ kiểm tra các mục dự kiến ​​được chứa trong danh sách thực tế theo thứ tự đã cho, nhưng không phải là những mục này là TẤT CẢ các mục thực tế. Phương thức 'Matchers.contains' kiểm tra danh sách chứa chính xác các mục được mong đợi. –

Trả lời

40

Bạn có thể sử dụng contains khớp thay vào đó, nhưng có lẽ bạn cần phải sử dụng phiên bản mới nhất của hamcrest. Phương pháp đó kiểm tra thứ tự.

assertThat(list, contains("foo", "boo")); 

Bạn cũng có thể thử sử dụng containsInAnyOrder nếu đơn đặt hàng không quan trọng với bạn.

Đó là mã cho contains khớp:

public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers) 
    { 
    return IsIterableContainingInOrder.contains(itemMatchers); 
    } 
+1

+1 Có, hãy cập nhật lên JUnit và Hamcrest mới nhất, mặc dù 'contains' đã tồn tại trong một khoảng thời gian. –

+1

Phiên bản nào của Hamcrest? Đối với tôi, 1,3 đang gây ra: java.lang.AssertionError: Dự kiến: có thể lặp lại có chứa ["foo", "boo"] nhưng: Không khớp: "bar" –

+1

giải pháp sẽ không hoạt động đối với một tập hợp con đã cho danh sách kết quả, vì chứa-Matcher không thành công với bất kỳ mục bổ sung nào không được đưa vào mảng mục mong muốn. – vvursT

3

Bạn cần phải thực hiện một Matcher tùy chỉnh, một cái gì đó như thế này

class ListMatcher extends BaseMatcher { 
    String[] items; 

    ListMatcher(String... items) { 
     this.items = items; 
    } 

    @Override 
    public boolean matches(Object item) { 
     List list = (List) (item); 
     int l = -1; 
     for (String s : items) { 
      int i = list.indexOf(s); 
      if (i == -1 || i < l) { 
       return false; 
      } 
      l = i; 
     } 
     return true; 
    } 

    @Override 
    public void describeTo(Description description) { 
     // not implemented 
    } 
} 

@Test 
public void test1() { 
    List<String> list = Arrays.asList("foo", "bar", "boo"); 
    Assert.assertThat(list, new ListMatcher("foo", "boo")); 
    Assert.assertThat(list, new ListMatcher("boo", "foo")); 
} 
+0

Mã của bạn không bao giờ trả về đúng - Tôi đã sửa lỗi đó. –

+2

OMG. Trận đấu này là xấu xí và lỗi. Nó sẽ mở rộng TypeSafeMatcher.Hoặc ít nhất là kiểm tra thể hiện của mục trong các phương thức matches() - hiện tại bạn có thể nhận ClassCastExecption. Và nó phải là một kiểu chung, bởi vì hiện tại nó chỉ hoạt động cho các chuỗi. Và nó sẽ xử lý null. Và các trận đấu() có độ phức tạp O (n^2). Và ... – Marek

1

Câu trả lời được chấp nhận là không làm việc cho tôi. Nó vẫn không thành công, nói rằng

Expected: iterable containing ["foo", "boo"] but: Not matched: "bar" 

Vì vậy, tôi đã viết IsIterableContainingInRelativeOrder và submitted it as a patch của riêng mình.

-1

Tôi tìm thấy một giải pháp tại http://www.baeldung.com/hamcrest-collections-arrays

Hãy tìm những phần đó có một ví dụ với trật tự nghiêm ngặt.

List<String> collection = Lists.newArrayList("ab", "cd", "ef"); 
assertThat(collection, contains("ab", "cd", "ef")); 

Về cơ bản bạn cần phải sử dụng chứa Matcher (org.hamcrest.Matchers.contains)

+3

Chào mừng bạn đến với Stack Overflow. Ở đây, tốt hơn nên bao gồm các phần quan trọng của mã trong câu trả lời của bạn. – AliLotfi

1

Để kiểm tra tha bộ sưu tập bao gồm các mục trong dự kiến ​​trật tự (cho) bạn có thể sử dụng phương pháp containsInRelativeOrder hamcrest của.

Từ javadoc:

Creates a matcher for Iterable's that matches when a single pass over the examined Iterable yields a series of items, that contains items logically equal to the corresponding item in the specified items, in the same relative order For example: assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder("b", "d")).

thực tế cho Java hamcrest 2.0.0.0.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan