2014-09-03 13 views
10

hasProperty può essere utilizzato con hasItem per verificare il valore di una data proprietà, ad esempio:Hamcrest matcher per controllare valore di ritorno del metodo nella raccolta

Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger")); 
assertThat(names, hasItem(hasName)); 

Questo va bene quando il nome è una proprietà, vale a dire: NON è un metodo chiamato getName().

C'è un verificatore che verificherà un metodo che non è una proprietà? vale a dire: in questo caso, controllerà il valore restituito del metodo name() anziché getName(), per gli elementi nella raccolta.

+0

quindi, vuoi chiamare il metodo name() su tutti gli elementi di una collezione? –

risposta

12

È possibile utilizzare un altro built-in di Hamcrest per questo, uno FeatureMatcher. Questi sono progettati per essere combinati con altri giocatori dopo che hanno trasformato il tuo input in qualcos'altro. Quindi nel tuo caso si dovrebbe fare qualcosa di simile:

@Test 
public void test1() { 
    List<Person> names = new ArrayList<>(); 
    names.add(new Person("Bob")); 
    names.add(new Person("i")); 

    assertThat(names, hasItem(name(equalTo("Winkleburger")))); 
} 

private FeatureMatcher<Person, String> name(Matcher<String> matcher) { 
    return new FeatureMatcher<Person, String>(matcher, "name", "name") { 
     @Override 
     protected String featureValueOf(Person actual) { 
      return actual.name(); 
     } 
    }; 
} 

Il beneficio si otterrà con questo corso di un matcher personalizzato è che è completamente riutilizzabile e componibile con altri matchers come tutto ciò che fa è il dato di estrazione poi rimanda a qualunque altro matcher desideri. Otterrai anche la diagnostica appropriata, ad es. nell'esempio sopra lo farai se cambierai l'assert a un valore che non è presente riceverai:

java.lang.AssertionError: 
    Expected: a collection containing name "Batman" 
    but: name was "Bob", name was "Winkleburger" 
2

È possibile scrivere uno voi stessi:

public class HasName extends TypeSafeMatcher<MyClass> { 
    private String expectedName; 

    private HasName(String expectedName) { 
     this.expectedName = expectedName; 
    } 

    @Override 
    public boolean matchesSafely(MyClass obj) { 
     return expectedName.equals(obj.name()); 
    } 

    @Factory 
    public static Matcher<MyClass> hasName(String expectedName) { 
     return new HasName(expectedName); 
    } 
} 

Dove MyClass è una classe o interfaccia che definisce il metodo name().

Problemi correlati