当前位置: 首页 > 知识库问答 >
问题:

Hamcrest Isnot匹配器与包装的自定义匹配器一起-描述不匹配不按预期工作

终逸仙
2023-03-14

最近,我为jaxb生成的元素做了一个自定义匹配器,遇到了这样的场景:

先决条件:

  • 我有一个自定义Matcher,它扩展了BaseMatcher,覆盖了方法describeTo和DescribeMatch(当然还有matches…)
  • 我使用的是assertThat(actualObject,而不是MyMatcherStaticRunMethod(expectedObject))

当断言失败时,结果是:

Expected: not myMatchersDescribeToDescription
but: isNotCoreMatcherDescribeMismatchDescription

挖掘组织的代码。汉克雷斯特。果心IsNot类我可以看出describeTo的实现是正确的(即,将描述的收集委托给包装的匹配器),但是DescribeMatch没有被覆盖,因此使用了BaseMatcher的版本。

恕我直言,这是一个错误的行为,因为不匹配也应该从包装的匹配器中提取。你们觉得怎么样,伙计们?

共有2个答案

凌嘉勋
2023-03-14

你从哪里得到的描述不匹配应该在匹配器中重载?Matcher界面指定matchdescripbeto(通过selfdescription)。因此,Hamcrest框架不会试图通过匹配器获取实际对象的描述,而只是匹配器本身的描述。

衡翰藻
2023-03-14

我不知道为什么这被否决了。我同意这是错误的行为。似乎与这个问题类似

您只能通过创建自己的自定义“notD”匹配器来修复它,它是IsNot匹配器的副本,添加了descripebematch的覆盖:

import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;

import static org.hamcrest.core.IsEqual.equalTo;


/**
 * Calculates the logical negation of a matcher.
 */
public class IsNotDescribing<T> extends BaseMatcher<T>  {
    private final Matcher<T> matcher;

    public IsNotDescribing(Matcher<T> matcher) {
        this.matcher = matcher;
    }

    @Override
    public boolean matches(Object arg) {
        return !matcher.matches(arg);
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("not ").appendDescriptionOf(matcher);
    }

    // use the matcher to describe its mismatch
    @Override
    public void describeMismatch(Object item, Description description) {
        matcher.describeMismatch(item, description);
    }

    @Factory
    public static <T> Matcher<T> notD(Matcher<T> matcher) {
        return new IsNotDescribing<T>(matcher);
    }

    @Factory
    public static <T> Matcher<T> notD(T value) {
        return notD(equalTo(value));
    }
}
 类似资料:
  • 我的问题是:这是一个bug还是我遗漏了什么? 事实上,不同的匹配器以不同的格式返回消息是一个很大的问题,因为我试图编写一些自定义的验证框架,该框架使用匹配器,并且能够在出现任何错误时返回良好的人类可读的消息。我似乎不能为此目的使用方法...

  • 我的密码应类似于: “密码应包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符,长度至少为八个字符” 我使用的模式是:

  • 我可以使用哪种匹配器? { test: /\.js$/, loader: 'babel-loader' } - Matches just .js { test: /\.(js|jsx)$/, loader: 'babel-loader' } - Matches both js and jsx Generally put it's just a JavaScript regex so standar

  • 我正在为我的 REST API 控制器编写测试,我需要检查返回的 对象中的 值,请参阅此测试方法: 但是测试产生了这个错误: 似乎ID被正确返回,但被序列化为不同的结构。 我的代码有什么问题?

  • 我试图更新一个实体与OneToOne关系使用restful Web服务。 我使用自定义查询,但它不工作 错误: java.lang.的参数值[2]不匹配预期的类型[com.mezoo.tdc.model.ActivityType(n/a)] 活动豆 豆子 它是可能的更新没有自定义查询?我想使用下面的POST请求: {"uuid":"9d9fa946-ee6e-408e-9e8a-7a9786a1d

  • 它打印出值的等效,这是因为这一行: 通过调用表示。 那么,如何使Hibernate相信是的实例? 我的枚举是由加载的。而由URLClassLoader加载,由另一个类加载器加载。