2015-03-04 13 views
35

Gegeben ein Collection oder Iterable von Artikeln, gibt es irgendwelche Matcher (oder eine Kombination von Matcher), die jedes Einzelteil bestätigt, entspricht ein einzelnes Matcher?Gibt es einen Hamcrest "für jeden" Matcher, der alle Elemente einer Collection oder Iterable Match einen einzelnen spezifischen Matcher behauptet?

Zum Beispiel gegeben dieser Objekttyp:

public interface Person { 
    public String getGender(); 
} 

Ich mag würde eine Behauptung schreiben, dass alle Elemente in einer Sammlung von Person s einen bestimmten gender Wert haben. Ich denke, so etwas wie dieses:

Iterable<Person> people = ...; 
assertThat(people, each(hasProperty("gender", "Male"))); 

Gibt es eine Möglichkeit, dies die each Matcher selbst ohne das Schreiben zu tun?

+3

Wahrscheinlich können Sie die everyItem Matcher verwenden: http://junit.sourceforge.net/javadoc/org/junit/matchers/JUnitMatchers.html –

Antwort

50

Verwenden Sie den Every Matcher.

import org.hamcrest.beans.HasPropertyWithValue; 
import org.hamcrest.core.Every; 
import org.hamcrest.core.Is; 
import org.junit.Assert; 

Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male"))))); 

hamcrest stellt auch Matchers#everyItem als eine Verknüpfung zu dieser Matcher.


Voll Beispiel

@org.junit.Test 
public void method() throws Exception { 
    Iterable<Person> people = Arrays.asList(new Person(), new Person()); 
    Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male"))))); 
} 

public static class Person { 
    String gender = "male"; 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 
} 
+0

Es scheint, dass Generika Probleme verursachen. Ich bekomme ein Kompilierungsproblem, weil 'assertThat()' Argumenttypen erwartet 'T, Matcher ' aber es erhält 'Iterable , Matcher >' –

+0

@ E-Riz, das ich mit einem vollen Beispiel aktualisiert habe. Wenn es anders ist, bearbeiten Sie bitte Ihre Frage, um sie aufzunehmen. –

+0

Ihr Beispiel hat immer noch das Problem der Generika-Kompilierung, aber nur, wenn es mit JDK 7 kompiliert wurde; mit JDK 8 kompiliert es gut. Ich war mir nicht bewusst, dass die Spezifikation der Generika zwischen 7 und 8 geändert wurde, aber offensichtlich erkannten sie, dass der Compiler dumm war und reparierten ihn. –

Verwandte Themen