Mockito: аргумент проверки - это карта с использованием шаблона регулярного выражения - PullRequest
0 голосов
/ 06 мая 2020

У меня есть функция, которая выполняет следующие действия:

mock_object.install_tool name:"Python27x32', type:"CustomTool'

При тестировании функции я хочу проверить следующее:

verify(mock_object, times(1)).install_tool(argThat(hasEntry('name')))
verify(mock_object, times(1)).install_tool(argThat(hasValue('Python\\d{2}x\\d{2}')))

Я пытаюсь использовать matches Сопоставление, но сбой со следующей ошибкой:

Ожидается 1 сопоставление, записано 2

Что мне делать, чтобы сопоставить значение карты с помощью регулярного выражения?

1 Ответ

1 голос
/ 06 мая 2020

Во-первых: org.hamcrest.Matchers.hasEntry требует 2 аргумента, ваш код только с одним аргументом недействителен

hasEntry('name') // no such overload

hasEntry имеет 2 перегрузки:

  • hasEntry(K key, V value)
  • hasEntry(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher)

Нам нужно сравнение значений в ключе и регулярное выражение в значении. Таким образом, мы используем:

  • ключ: Matchers.is(T value)
  • значение: одно из
    • Matchers.matchesPattern(java.lang.String regex)
    • Matchers.matchesRegex(java.lang.String regex)

К сожалению, в Java нам нужно дополнительное непроверенное приведение. Смотрите Mockito, argThat и hasEntry

В итоге получаем:

Matcher<String> mapKeyMatcher = Matchers.is("name");
Matcher<String> mapValueMatcher = Matchers.matchesPattern("Python\\d{2}x\\d{2}");

verify(mock_object, times(1)).install_tool(
        (Map<String, String>) argThat(
                hasEntry(mapKeyMatcher, mapValueMatcher)
        )
);

Обновление на Hamcrest

Mockito приходит с собственным набором сопоставителей: org.mockito.ArgumentMatchers, но, к сожалению, у него нет сопоставителей карт. К счастью, Hamcrest умеет, и именно поэтому вы в первую очередь использовали Hamcrest.

Чтобы адаптировать сопоставитель Hamcrest к сопоставителю Mockito, вы используете argThat(YOUR_HAMCREST_MATCHER)

Сопоставитель карт, который мы решили использовать, имеет следующую сигнатуру:

hasEntry(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher)

Оба аргумента являются сопоставителями Hamcrest. Вы не можете передать сопоставление регулярных выражений из Mockito, вам нужно использовать Hamcrest one.

...