Hamcrest IsNot matcher вместе с упакованным пользовательским сопоставителем - descriptionMismatch не работает должным образом

1

Недавно я создал пользовательский макет для созданного jaxb элемента и пришел к такому сценарию:

Предпосылки:

  • У меня есть пользовательский Matcher, расширяющий BaseMatcher с помощью переопределенных методов, описывающих описание и описаниеMismatch (и, конечно, совпадений).
  • Я использую assertThat (actualObject, not (myMatchersStaticRunMethod (expectedObject))

Когда утверждение терпит неудачу, в результате я:

Expected: not myMatchersDescribeToDescription
but: isNotCoreMatcherDescribeMismatchDescription

Копая в коде класса org.hamcrest.core.IsNot, я могу видеть, что описание правильно реализовано (т.е. Делегирует сборку описания в завернутый совпадение), но описаниеMismatch не переопределяется, поэтому используется версия BaseMatcher.

Имхо это ошибочное поведение, потому что несоответствие должно быть также принято из завернутого совпадения. Что вы думаете, ребята?

  • 0
    Вы на самом деле используете TypeSafeMatcher ?
Теги:
hamcrest
junit

2 ответа

0
Лучший ответ

Я не знаю, почему это было отклонено. Я согласен, что это ошибочное поведение. Похоже на эту проблему

Вы можете исправить это, только создав собственный пользовательский "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));
    }
}
0

Где вы получаете, что describeMismatch должно быть перегружено в Matcher? Интерфейс Matcher указывает match и describeTo (через SelfDescribing). Следовательно, рамка Hamcrest не пытается получить описание фактического объекта через Matcher, просто описание самого Matcher.

  • 0
    На самом деле, SelfDescribing содержит только describeTo абстрактный метод. Другое дело, IsNot обертка согласовань какой - то образом имеет возможность использовать describeTo метод это внутренне обернутый объект, но не в случае describeMismatch , почему?
  • 0
    Да, это то, что я сказал («опишите через SelfDescribing»). Дело в том, что Matcher задает два метода, каждый из которых - describeMismatch так почему вы ожидаете, что describeMismatch будет вызываться на вашем Matcher ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню