gpt4 book ai didi

java - 具有不同对象的自定义匹配器

转载 作者:行者123 更新时间:2023-12-01 09:46:53 32 4
gpt4 key购买 nike

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

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,它允许传递不同的对象来简单地依赖于匹配的输出,而不是强制相同类型的实际和预期?

最佳答案

请小心将 Mockito 匹配器和 Hamcrest 匹配器分开。 Hamcrest 或 Hamcrest 风格的匹配器是一个对象实例,就像你的 new DetailsMatcher(expected) 一样。多于。调用argThat ,你的valueObjectEq似乎返回 Details对象,但这不是真的:它将返回 null Mockito 会将对象保存在内部堆栈上。因此,您永远不应该调用 argThat调用when之外的电话或verify .

相反,请将您的 DetailsMatcher 更改为 ArgumentMatcher<Request> 类型表明您的匹配器可以在任何 Request 上工作,不仅仅是 Details ,并将构造函数公开,以便您可以像这样调用它:

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

其他一些注意事项:

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

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

另请参阅:

关于java - 具有不同对象的自定义匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37927583/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com