Hamcrest'te bir Listenin boş olmadığını kontrol etme


149

Bir Listenin boş olup olmadığını kontrol etmenin bir yolunu bilip bilmediğini merak ediyordum assertThat()ve Matchers?

JUnit'i görebildiğim en iyi yol:

assertFalse(list.isEmpty());

Ama bunu Hamcrest'te yapmanın bir yolu olduğunu umuyordum.


2
Daha iyi bir çözüm için oy verin: code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos

2
@FabricioLemos sorunu # 97 çözülmüş gibi görünüyor ve git dalında uzmanlaşmak için birleştirildi. Yakında bir sonraki hamcrest sürümünde olacağını umalım.
rafalmag

@rafalmag İyi nokta.
V1.3

Yanıtlar:


169

Her zaman vardır

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

... ama sanırım kastettiğin tam olarak bu değil :)

Alternatif olarak:

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

empty()Matcherssınıfta bir statiktir . Döküm ihtiyacını Not listiçin Collection, hamcrest 1.2 'sakat jenerik sayesinde.

Aşağıdaki içe aktarmalar hamcrest 1.3 ile kullanılabilir

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

6
Parantezi görünmez yapmak için sözdizimi vurgulamanızı değiştirirseniz Hamcrest kodunun çok daha güzel göründüğünü düşünüyorum ...
skaffman

2
@ tkeE2036: İşte Hamcrest'in bozuk jenerikleri. Bazen derlemek için döküm yapmanız gerekir, örneğinassertThat((Collection)list, is(not(empty())));
skaffman

7
Bu sorun 1.3'te düzeltildi
artbristol

14
@dzieciou, test başarısız olduğunda size daha iyi bir hata mesajı verir. Yani expected true but got falsesenin yerine şöyle bir şey alexpected empty but got [1, 2, 3]
Brad Cupit

3
Kontrolsüz bir dönüştürme istemiyorsanız ve statik içe assertThat(list, Matchers.<String>empty())String
aktarmayı bırakmaya istekliyseniz

77

Bu, Hamcrest 1.3'te düzeltilmiştir. Aşağıdaki kod derlenir ve herhangi bir uyarı oluşturmaz:

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

Ancak daha eski bir sürümü kullanmanız gerekiyorsa - dinleme yapmak yerine empty()şunları kullanabilirsiniz:

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

Misal:

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

Yukarıdaki çözümlerle ilgili en önemli şey, herhangi bir uyarı üretmemesidir. Minimum sonuç boyutunu tahmin etmek istiyorsanız ikinci çözüm daha da kullanışlıdır.


1
@rogerdpack Buyurun. 1.3 stili örneğini ekledim. :)
rafalmag

1
Sakının assertThat(list, not(hasSize(0)))olacak başarılı olursa listolduğunu nullaksine,assertThat(list, hasSize(greaterThan(0)))
José Andias

5

Okunabilir hata mesajlarının peşindeyseniz, normal assertEquals'ı boş bir liste ile kullanarak hamcrest olmadan yapabilirsiniz:

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

Örneğin koşarsan

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

sen alırsın

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

2
Sözde boş olan listede ne kaldığını görmek gerçekten çok güzel!
2014

0

Kendi özel IsEmpty TypeSafeMatcher'ınızı oluşturun:

Jenerik problemler çözülmüş olsa bile, 1.3bu metodun en güzel yanı, metodu olan herhangi bir sınıfta çalışıyor olmasıdır isEmpty()! Sadece değil Collections!

Örneğin üzerinde Stringde çalışacak !

/* 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

Bu çalışıyor:

assertThat(list,IsEmptyCollection.empty())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.