2014-07-17 10 views
7

ich diese Codezeile ausgeführt werden soll:wie ein hamcrest implementieren Matcher

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

aber ich möchte das Protokoll informativ

was bedeutet, dass ich weiß, könnte drucken, welche Felder nicht waren gleich.

Also habe ich gedacht, einen Matcher zu implementieren.

Ich habe es gegoogelt, aber kann es nicht richtig

als meine Methode die actual und expected Objekte zusammen bekommen konnte nicht schreiben.

hier ist mein Code:

wie kann ich es sauber schreiben?

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

Bitte schauen Sie auf den Quellcode einiger eingebauten in hamcrest Matcher. Sie zeigen Ihnen, wie Sie matchesSafely und describeTo überschreiben. –

Antwort

1

Ihre Matches sollte expected im Konstruktor erhalten und vergleichen Sie sie gegen den „Ist-Wert“ item Parameter matchesSafely geben. Sie sollten matches nicht überschreiben.

Dies wird in einer Reihe aufstellen, was assertThat erwartet:

assertThat(actual, matcher-using-expected); 

Ich denke, der String-basierter Matcher typsicher ist und ein gutes Beispiel geben.

4

Versuchen Sie, etwas mehr wie folgt aus:

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); 

    } 
}