2014-12-15 7 views
15

Gibt es einen Hamcrest-Matcher, der überprüft, dass das Argument weder eine leere Collection noch null ist?Gibt es einen Hamcrest-Matcher, um zu überprüfen, dass eine Collection weder leer noch null ist?

Ich glaube, ich immer

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

verwenden könnte, aber ich habe mich gefragt, ob es einen einfacheren Weg ist und ich es verpasst.

+3

Das sieht ziemlich einfach für mich aus. Außerdem ist es wichtig, dass Ihre Tests ihre Absicht so klar wie möglich zum Ausdruck bringen und dass der Code gut lesbar ist. – skaffman

+0

Ich kenne hamcrest nicht wirklich, aber logisch könnte man nach Größe> = 0 suchen, wenn die API solche Aufrufe unterstützt. – mike

+0

Der Titel dieser Frage stellt das Gegenteil des Körpers dieser Frage. Um den Titel der Frage zu beantworten: 'assertThat (metadata, entweder (is (empty())) .oder (is (nullValue())));' – Abdull

Antwort

10

Sie können die IsCollectionWithSize kombinieren und das OrderingComparison Matcher:

@Test 
public void test() throws Exception { 
    Collection<String> collection = ...; 
    assertThat(collection, hasSize(greaterThan(0))); 
} 
  • Für collection = null Sie erhalten

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0> 
        but: was null 
    
  • Für collection = Collections.emptyList() erhalten Sie

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0> 
        but: collection size <0> was equal to <0> 
    
  • Für collection = Collections.singletonList("Hello world") ist der Test bestanden.

Edit:

habe gerade bemerkt, dass die folgende approch ist nicht Arbeits:

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

Je mehr ich darüber nachdenke, desto mehr ich ein wenig verändert empfehlen würde Version der Anweisung, die vom OP geschrieben wurde, wenn Sie explizit auf null testen möchten.

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

Ich akzeptiere deine Antwort, weil ich denke, dass beide Wege, 'hasSize (größer als (0))' und 'both (nicht (leer())) und (notNullValue())' ein guter Weg sind. – jhyot

+0

Irgendein Grund, warum ich '1 Erwartung scheiterte. JSON-Pfadbilder stimmen nicht überein. Erwartet: (eine leere Auflistung oder null) Actual: null ', wenn ich versuche, mit Ihrem Code auf leere Sammlung oder Null zu überprüfen: 'myResponse.body (myArrayAttr, entweder (leer()). Oder (nullValue())); ' – TheBakker

2

Wie ich in den Kommentaren geschrieben, das logische Äquivalent von collection != null und size != 0 ist size > 0, das bedeutet, die Sammlung nicht null ist. Ein einfacherer Weg zum Ausdrücken size > 0 ist there is an (arbitrary) element X in collection. Unterhalb eines Arbeitscodebeispiels.

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 
    } 
}