2014-12-15 26 views
15

Czy istnieje narzędzie Hamcrest, które sprawdza, czy argument nie jest pustym zbiorem, czy nie jest pusty?Czy istnieje narzędzie Hamcrest do sprawdzania, czy kolekcja nie jest pusta ani nie ma wartości null?

Chyba zawsze przydałoby

both(notNullValue()).and(not(hasSize(0)) 

ale zastanawiałem się, czy istnieje prostszy sposób i brakowało mi go.

+3

To wygląda dla mnie bardzo prosto. Ważne jest również, aby twoje testy wyrażały swoje zamiary z jak największą klarownością, a kod jest bardzo czytelny. – skaffman

+0

Nie znam się na hamowaniu, ale logicznie można sprawdzić "size> = 0", jeśli API obsługuje takie wywołania. – mike

+0

ten tytuł pytania prosi o przeciwieństwo ciała tego pytania. Aby odpowiedzieć na pytanie tytuł: 'assertThat (metadane, albo (jest (puste())) .or (is (nullValue()));' – Abdull

Odpowiedz

10

Można połączyć IsCollectionWithSize a OrderingComparison dopasowywania:

@Test 
public void test() throws Exception { 
    Collection<String> collection = ...; 
    assertThat(collection, hasSize(greaterThan(0))); 
} 
  • Dla collection = null masz

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0> 
        but: was null 
    
  • Dla collection = Collections.emptyList() masz

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0> 
        but: collection size <0> was equal to <0> 
    
  • Dla testu collection = Collections.singletonList("Hello world") test przechodzi.

Edit:

Właśnie zauważyłem, że po approch jest nie robocze:

assertThat(collection, is(not(empty()))); 

Im więcej o tym myślę, tym bardziej polecam nieco zmienione wersja instrukcji napisanej przez OP, jeśli chcesz przetestować jawnie na wartość null.

assertThat(collection, both(not(empty())).and(notNullValue())); 
+0

Zaakceptowałem twoją odpowiedź, ponieważ myślę, że oba sposoby pokazane tutaj, 'hasSize (większyThan (0))' i 'oba (nie (pusty())) i (notNullValue())' są dobrym sposobem. – jhyot

+0

Dowolny powód, dla którego otrzymałem oczekiwanie "1", nie powiodło się. Obrazy ścieżki JSON nie pasują. Oczekiwano: (pusta kolekcja lub zerowa) Rzeczywiste: null' przy próbie sprawdzenia pustej kolekcji lub wartości pustej z kodem: 'myResponse.body (myArrayAttr, albo (pusta()). Lub (nullValue())); ' – TheBakker

2

Jak pisał w komentarzach, logicznym odpowiednikiem collection != null i size != 0 jest size > 0, że implikuje kolekcja nie jest null. Prostszym sposobem wyrażania size > 0 jest there is an (arbitrary) element X in collection. Poniżej przykład działającego kodu.

import static org.hamcrest.core.IsCollectionContaining.hasItem; 
import static org.hamcrest.CoreMatchers.anything; 

public class Main { 

    public static void main(String[] args) { 
     boolean result = hasItem(anything()).matches(null); 
     System.out.println(result); // false for null 

     result = hasItem(anything()).matches(Arrays.asList()); 
     System.out.println(result); // false for empty 

     result = hasItem(anything()).matches(Arrays.asList(1, 2)); 
     System.out.println(result); // true for (non-null and) non-empty 
    } 
}