Недавно я создал пользовательский макет для созданного jaxb элемента и пришел к такому сценарию:
Предпосылки:
Когда утверждение терпит неудачу, в результате я:
Expected: not myMatchersDescribeToDescription
but: isNotCoreMatcherDescribeMismatchDescription
Копая в коде класса org.hamcrest.core.IsNot, я могу видеть, что описание правильно реализовано (т.е. Делегирует сборку описания в завернутый совпадение), но описаниеMismatch не переопределяется, поэтому используется версия BaseMatcher.
Имхо это ошибочное поведение, потому что несоответствие должно быть также принято из завернутого совпадения. Что вы думаете, ребята?
Я не знаю, почему это было отклонено. Я согласен, что это ошибочное поведение. Похоже на эту проблему
Вы можете исправить это, только создав собственный пользовательский "notD" -сервер, его копию IsNot
добавляющую Override для 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));
}
}
Где вы получаете, что describeMismatch
должно быть перегружено в Matcher
? Интерфейс Matcher
указывает match
и describeTo
(через SelfDescribing
). Следовательно, рамка Hamcrest не пытается получить описание фактического объекта через Matcher
, просто описание самого Matcher
.
SelfDescribing
содержит только describeTo
абстрактный метод. Другое дело, IsNot
обертка согласовань какой - то образом имеет возможность использовать describeTo
метод это внутренне обернутый объект, но не в случае describeMismatch
, почему?
Matcher
задает два метода, каждый из которых - describeMismatch
так почему вы ожидаете, что describeMismatch
будет вызываться на вашем Matcher
?
TypeSafeMatcher
?