问题
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;
}
}
回答1:
Try something more like this:
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);
}
}
回答2:
Your matches should receive expected
in the constructor and compare it against the "actual value" item
parameter passed to matchesSafely
. You should not override matches
.
This will line up with what assertThat
expects:
assertThat(actual, matcher-using-expected);
I think the string-based matchers are type-safe and will provide a good example.
来源:https://stackoverflow.com/questions/24808392/how-to-implement-a-hamcrest-matcher