2014-07-17 15 views
7

Voglio correre questa riga di codice:come implementare un hamcrest matcher

assertThat(contextPin.get(), equalTo(pinPage.getPinObjFromUi()));

ma voglio stampare il registro essere informativo

il che significa che ho potuto sapere che i campi non erano pari.

Quindi ho pensato di implementare un matcher.

Googled, ma non sono riuscito a scriverlo correttamente

come il mio metodo non ha potuto ottenere i actual e expected oggetti insieme.

Ecco il mio codice:

come posso scriverlo pulito?

public class PinMatcher extends TypeSafeMatcher<Pin> { 

    private Pin actual; 
    private Object item; 

    public PinMatcher(Pin actual) { 
     this.actual = actual; 
    } 

    @Override 
    protected boolean matchesSafely(Pin item) { 
     return false; 
    } 

    @Override 
    public void describeTo(Description description) { 

    } 

//cannot override this way 
    @Override 
    public boolean matches(Object item){ 
     assertThat(actual.title, equalTo(expected.title)); 
return true; 
    } 

//cannot access actual when called like this: 
// assertThat(contextPin.get(), new PinMatcher.pinMatches(pinPage.getPinObjFromUi())); 
    @Override 
    public boolean pinMatches(Object item){ 
     assertThat(actual.title, equalTo(expected.title)); 
return true; 
    } 
} 
+1

Si prega di guardare il codice sorgente di alcuni built-in Hamcrest matcher. Ti mostrano come sovrascrivere le partite in modo appropriato e descriverti. –

risposta

1

le partite dovrebbero ricevere expected nel costruttore e confrontarlo contro il "valore reale" item parametro passato al matchesSafely. Non dovresti ignorare lo matches.

Questo sarà allineato con quello che si aspetta assertThat:

assertThat(actual, matcher-using-expected); 

Credo che i matchers stringa-based sono type-safe e forniranno un buon esempio.

4

Provare qualcosa di più simile a questo:

package com.mycompany.core; 

import org.hamcrest.Description; 
import org.hamcrest.TypeSafeMatcher; 


public class PinMatcher extends TypeSafeMatcher<Pin> { 

    private Pin actual; 

    public PinMatcher(Pin actual) { 
     this.actual = actual; 
    } 

    @Override 
    protected boolean matchesSafely(Pin item) { 
     return actual.title.equals(item.title); 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText("should match title ").appendText(actual.title); 

    } 
}