how to implement a hamcrest matcher

Elad Benda2 picture Elad Benda2 · Jul 17, 2014 · Viewed 7.5k times · Source

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

Answer

schnitz picture schnitz · Oct 29, 2014

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

    }
}