如何实现hamcrest匹配器

时间:2014-07-17 16:02:09

标签: java equals matcher hamcrest

我想运行这行代码:

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

但我想打印到日志中提供信息

意思是我可以知道哪些字段不相等。

所以我想过要实现一个匹配器。

我用Google搜索了,但无法正确编写

因为我的方法无法将actualexpected个对象放在一起。

这是我的代码:

我怎么写得干净?

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

2 个答案:

答案 0 :(得分:4)

尝试更像这样的事情:

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

    }
}

答案 1 :(得分:2)

您的匹配应在构造函数中收到expected,并将其与传递给item的“实际值”matchesSafely参数进行比较。您不应该覆盖matches

这将符合assertThat期望的内容:

assertThat(actual, matcher-using-expected);

我认为基于字符串的匹配器是类型安全的,并且会提供一个很好的例子。