Memeriksa bahwa Daftar tidak kosong di Hamcrest

147

Saya bertanya-tanya apakah ada yang tahu cara untuk memeriksa apakah Daftar kosong menggunakan assertThat()dan Matchers?

Cara terbaik yang bisa saya lihat hanya menggunakan JUnit:

assertFalse(list.isEmpty());

Tapi saya berharap ada cara untuk melakukan ini di Hamcrest.

Ian Dallas
sumber
2
Untuk solusi yang lebih baik, pilih: code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos
2
@FabricioLemos masalah # 97 tampaknya diselesaikan dan mendapatkan master cabang git. Mari kita berharap akan segera di rilis hamcrest berikutnya.
rafalmag
@rafalmag Tempat yang bagus. Akan lebih baik untuk memperbaiki semua pernyataan saya yang tidak bisa dibaca ketika v1.3 dirilis
andyb

Jawaban:

165

Yah selalu ada

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

... tapi saya rasa itu tidak cukup apa yang Anda maksud :)

Kalau tidak:

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

empty()adalah statis di Matcherskelas. Perhatikan kebutuhan untuk melemparkan listke Collection, berkat Hamcrest 1,2 ini obat generik miring.

Impor berikut dapat digunakan dengan hamcrest 1.3

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
skaffman
sumber
6
Saya menemukan bahwa kode Hamcrest terlihat jauh lebih baik jika Anda mengubah penyorotan sintaks Anda untuk membuat tanda kurung tidak terlihat ...
skaffman
2
@ tkeE2036: Itu obat generik Hamcrest yang rusak di tempat kerja. Kadang-kadang Anda perlu melakukan cast untuk membuatnya dikompilasi, misalnyaassertThat((Collection)list, is(not(empty())));
skaffman
7
Ini diperbaiki di 1,3
artbristol
14
@ Dzieciou itu memberi Anda pesan kesalahan yang lebih baik ketika tes gagal. Jadi, bukannya expected true but got falseAnda mendapatkan sesuatu sepertiexpected empty but got [1, 2, 3]
Brad Cupit
3
Jika Anda lebih suka tidak ada konversi yang tidak dicentang, dan bersedia menyerahkan impor statis, maka Anda dapat menambahkan obat generik ke metode, seperti: assertThat(list, Matchers.<String>empty())(asumsi daftar adalah kumpulan dari Strings)
earcam
77

Ini diperbaiki di Hamcrest 1.3. Kode di bawah ini mengkompilasi dan tidak menghasilkan peringatan apa pun:

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

Tetapi jika Anda harus menggunakan versi yang lebih lama - alih-alih disadap, empty()Anda dapat menggunakan:

hasSize(greaterThan(0))
( import static org.hamcrest.number.OrderingComparison.greaterThan;atau
import static org.hamcrest.Matchers.greaterThan;)

Contoh:

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

Yang paling penting tentang solusi di atas adalah tidak menghasilkan peringatan. Solusi kedua bahkan lebih berguna jika Anda ingin memperkirakan ukuran hasil minimum.

rafalmag
sumber
1
@rogerdpack Ini dia. Saya menambahkan contoh gaya 1.3. :)
rafalmag
1
Hati-hati bahwa assertThat(list, not(hasSize(0)))akan sukses jika listadalah null, sebagai lawanassertThat(list, hasSize(greaterThan(0)))
José Andias
5

Jika Anda mencari pesan gagal yang dapat dibaca, Anda dapat melakukannya tanpa hamcrest dengan menggunakan assertEquals yang biasa dengan daftar kosong:

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

Misal jika Anda berlari

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

Anda mendapatkan

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
kamczak
sumber
2
Sangat menyenangkan melihat apa yang tersisa di daftar yang seharusnya kosong!
HDave
0

Buat IsEmpty TypeSafeMatcher kustom Anda sendiri:

Bahkan jika masalah generik diperbaiki dalam 1.3hal yang hebat tentang metode ini apakah ia bekerja pada kelas yang memiliki isEmpty()metode! Bukan hanya Collections!

Misalnya itu akan berhasil Stringjuga!

/* 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"); }
}
Komunitas
sumber
0

Ini bekerja:

assertThat(list,IsEmptyCollection.empty())
Richard
sumber