Kiểm tra xem Danh sách không trống trong Hamcrest


147

Tôi đã tự hỏi nếu có ai biết một cách để kiểm tra nếu một Danh sách trống bằng cách sử dụng assertThat()Matchers?

Cách tốt nhất tôi có thể thấy chỉ cần sử dụng JUnit:

assertFalse(list.isEmpty());

Nhưng tôi đã hy vọng rằng có một số cách để làm điều này trong Hamcrest.


2
Để có giải pháp tốt hơn, hãy bỏ phiếu cho: code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos

2
Vấn đề @FovenioLemos # 97 dường như được giải quyết và sáp nhập vào nhánh git chính. Hãy hy vọng nó sẽ sớm được phát hành trong hamcrest tiếp theo.
rafalmag

@rafalmag Điểm tốt. Sẽ rất tốt để sửa tất cả các xác nhận không dễ đọc của tôi khi v1.3 được phát hành
andyb

Câu trả lời:


165

Vâng luôn có

assertThat(list.isEmpty(), is(false));

... nhưng tôi đoán đó không hoàn toàn là ý bạn :)

Cách khác:

assertThat((Collection)list, is(not(empty())));

empty()là một tĩnh trong Matcherslớp. Lưu ý sự cần thiết phải cast listđể Collection, nhờ Generics rung rinh hamcrest 1.2 của.

Các nhập khẩu sau đây có thể được sử dụng với hamcrest 1.3

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;

6
Tôi thấy rằng mã Hamcrest trông đẹp hơn nhiều nếu bạn thay đổi tô sáng cú pháp của mình để làm cho dấu ngoặc đơn trở nên vô hình ...
skaffman

2
@ tkeE2036: Đó là thuốc generic bị hỏng của Hamcrest tại nơi làm việc. Đôi khi bạn cần phải cast để làm cho nó biên dịch, ví dụassertThat((Collection)list, is(not(empty())));
skaffman

7
Điều này được cố định trong 1.3
artbristol

14
@dzieciou nó cung cấp cho bạn một thông báo lỗi tốt hơn khi thử nghiệm thất bại. Vì vậy, thay vì expected true but got falsebạn nhận được một cái gì đó nhưexpected empty but got [1, 2, 3]
Brad Cupit

3
Nếu bạn không thích chuyển đổi không được kiểm tra và sẵn sàng từ bỏ nhập tĩnh, thì bạn có thể thêm tổng quát vào phương thức, như: assertThat(list, Matchers.<String>empty())(danh sách giả sử là một bộ sưu tập String)
Earcam

77

Điều này được cố định trong Hamcrest 1.3. Đoạn mã dưới đây biên dịch và không tạo ra bất kỳ cảnh báo nào:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));

Nhưng nếu bạn phải sử dụng phiên bản cũ hơn - thay vì lỗi, empty()bạn có thể sử dụng:

hasSize(greaterThan(0))
( import static org.hamcrest.number.OrderingComparison.greaterThan;hoặc
import static org.hamcrest.Matchers.greaterThan;)

Thí dụ:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, hasSize(greaterThan(0)));

Điều quan trọng nhất về các giải pháp trên là nó không tạo ra bất kỳ cảnh báo nào. Giải pháp thứ hai thậm chí còn hữu ích hơn nếu bạn muốn ước tính kích thước kết quả tối thiểu.


1
@rogerdpack Ở đây bạn đi. Tôi đã thêm ví dụ kiểu 1.3. :)
rafalmag

1
Ghi chú rằng assertThat(list, not(hasSize(0)))sẽ thành công nếu listnull, như trái ngược vớiassertThat(list, hasSize(greaterThan(0)))
José Andias

5

Nếu bạn sau các tin nhắn thất bại có thể đọc được, bạn có thể thực hiện mà không cần hamcrest bằng cách sử dụng các assertEquals thông thường với một danh sách trống:

assertEquals(new ArrayList<>(0), yourList);

Ví dụ nếu bạn chạy

assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");

bạn lấy

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]

2
Thật tuyệt khi thấy những gì còn lại trong danh sách được cho là trống rỗng!
HDave

0

Tạo loại IsEmpty tùy chỉnh của riêng bạn:

Ngay cả khi các vấn đề chung được khắc phục trong 1.3điều tuyệt vời của phương thức này là nó hoạt động trên bất kỳ lớp nào có isEmpty()phương thức! Không chỉ Collections!

Ví dụ, nó cũng sẽ hoạt động String!

/* Matches any class that has an <code>isEmpty()</code> method
 * that returns a <code>boolean</code> */ 
public class IsEmpty<T> extends TypeSafeMatcher<T>
{
    @Factory
    public static <T> Matcher<T> empty()
    {
        return new IsEmpty<T>();
    }

    @Override
    protected boolean matchesSafely(@Nonnull final T item)
    {
        try { return (boolean) item.getClass().getMethod("isEmpty", (Class<?>[]) null).invoke(item); }
        catch (final NoSuchMethodException e) { return false; }
        catch (final InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); }
    }

    @Override
    public void describeTo(@Nonnull final Description description) { description.appendText("is empty"); }
}

0

Những công việc này:

assertThat(list,IsEmptyCollection.empty())
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.