【问题标题】:Custom matchers with different object具有不同对象的自定义匹配器
【发布时间】:2016-06-20 16:34:50
【问题描述】:

您好,我正在编写一个自定义匹配器来验证两个不同的对象,我的代码是:

public class DetailsMatcher extends ArgumentMatcher <Details> {

    private final Details expected;

    private DetailsMatcher(Details expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object actual) {
        return ((Request) actual).getId().equals(expected.getId());
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(expected == null ? null : expected.toString());
    }

    public static Details valueObjectEq(Details expected) {
        return argThat(new DetailsMatcher(expected));
    }
}

我想在我的测试中使用它:

assertThat(requestModel, DetailsMatcher.valueObjectEq(response));

但这是两个不同的对象,所以它不起作用。我不想仅仅为了测试目的而改变我的对象,所以我们是否有一些像 assertThat 这样的 api,它允许传递不同的对象以简单地依赖于匹配的输出,而不是强制实际和预期的相同类型?

【问题讨论】:

    标签: java mockito matcher hamcrest


    【解决方案1】:

    请注意将 Mockito 匹配器和 Hamcrest 匹配器分开。 Hamcrest 或 Hamcrest 风格的匹配器是一个对象实例,就像上面的 new DetailsMatcher(expected) 一样。通过调用argThat,您的valueObjectEq 似乎返回了Details 对象,但事实并非如此:它将返回null,并且Mockito 会将对象保存在内部堆栈中。因此,您永远不应该在调用whenverify 之外调用argThat

    相反,将您的 DetailsMatcher 更改为 ArgumentMatcher&lt;Request&gt; 类型,以表明您的 Matcher 可以在任何 Request 上工作,而不仅仅是 Details,并将构造函数公开,以便您可以这样调用它:

    assertThat(requestModel, new DetailsMatcher(orderResponse));
    // or with a static helper method you write:
    assertThat(requestModel, matchesValueObject(orderResponse));
    

    其他几点说明:

    • Matcher.matches 永远不应该抛出异常,但如果你传入非请求,它会在这里这样做。检查 instanceof,如果参数不是 Matcher,则返回 false
    • Mockito 2.0 使 ArgumentMatcher 成为自己的类,而不是扩展 org.hamcrest.Matcher。如果您想继续使用 Matcher 的 Hamcrest 属性,您可能需要让它同时扩展两者,或者只是将其设为 Hamcrest 匹配器并调整 valueObjectEq 以调用 MockitoHamcrest.argThat。
    • 虽然错误信息不会那么清楚,但您始终可以手动调用该方法:

      assertTrue(new DetailsMatcher(orderReponse).matches(requestModel));
      

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2015-10-24
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多