gpt4 book ai didi

java - Hamcrest IsNot 匹配器与包装的自定义匹配器一起使用 - describeMismatch 无法按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 14:38:57 25 4
gpt4 key购买 nike

最近我为 jaxb 生成的元素制作了一个自定义匹配器,并遇到了这种情况:

前提条件:

  • 我有一个自定义匹配器,它使用重写方法describeTo和describeMismatch(当然还有匹配......)扩展了BaseMatcher
  • 我正在使用assertThat(actualObject, not(myMatchersStaticRunMethod(expectedObject))

当断言失败时,结果是:

Expected: not myMatchersDescribeToDescription
but: isNotCoreMatcherDescribeMismatchDescription

深入研究 org.hamcrest.core.IsNot 类的代码,我可以看到,describeTo 已正确实现(即,将描述的收集委托(delegate)给包装的匹配器),但 describeMismatch 未被覆盖,因此使用了 BaseMatcher 的版本。

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

最佳答案

我不知道为什么这被否决了。我同意这是错误的行为。看起来类似于 this issue

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

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

关于java - Hamcrest IsNot 匹配器与包装的自定义匹配器一起使用 - describeMismatch 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203136/

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