I want to run this line of code:
assertThat(contextPin.get(), equalTo(pinPage.getPinObjFromUi()));
but I want to print to the log be informative
meaning that I could know which fields were not equal.
So I have thought to implement a matcher.
I have googled it, but couldn't write it properly
as my method couldn't get the actual
and expected
objects together.
here is my code:
how can I write it clean?
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;
}
}
Try something more like this:
Your matches should receive
expected
in the constructor and compare it against the "actual value"item
parameter passed tomatchesSafely
. You should not overridematches
.This will line up with what
assertThat
expects:I think the string-based matchers are type-safe and will provide a good example.