Во-первых: 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.