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.
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.
Yanıtlar:
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()
Matchers
sınıfta bir statiktir . Döküm ihtiyacını Not list
iç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.*;
assertThat((Collection)list, is(not(empty())));
expected true but got false
senin yerine şöyle bir şey alexpected empty but got [1, 2, 3]
assertThat(list, Matchers.<String>empty())
String
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.
assertThat(list, not(hasSize(0)))
olacak başarılı olursa list
olduğunu null
aksine,assertThat(list, hasSize(greaterThan(0)))
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]
Jenerik problemler çözülmüş olsa bile, 1.3
bu 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 String
de ç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"); }
}