проблемы с сопоставлением hamcrest и методом argThat

Я получил этот фрагмент кода в своем тестовом классе:

then(collector()).should().emit(eq(myStream), eq(myTuple),
        argThat(allOf(hasItem(anyString()), hasItem("test1"), hasItem("test2"))));

Проблема в том, что я не знаю значение первого Item. Я только знаю, что значение имеет тип String.

Если я выполняю тест, я получаю сообщение:

Недопустимое использование сопоставителей аргументов! Ожидается 3 совпадения, записано 5

Более того:

Это исключение может возникнуть, если сопоставители объединены с необработанными значениями: // неправильно: someMethod(anyObject(), "raw String"); При использовании сопоставителей все аргументы должны предоставляться сопоставителями. Например: // правильно: someMethod(anyObject(), eq("Строка по сопоставителю"));

Я не вижу проблемы прямо знаю.

Спасибо за любую помощь.


person s_bei    schedule 19.08.2016    source источник
comment
Похоже, ваш anyString исходит от Mockito, а не от Hamcrest...   -  person Boris the Spider    schedule 19.08.2016
comment
Не могли бы вы добавить свой импорт?   -  person Manu    schedule 19.08.2016
comment
Привет Борис. Ты прав. он работает с любым (String.class). дайте это как ответ, и я приму его. спасибо за помощь   -  person s_bei    schedule 19.08.2016
comment
@StefanBeike Я все еще второй Ману в том, что вы должны опубликовать свой импорт. Борис прав, что emit должен иметь сопоставитель Mockito для каждого параметра, а allOf должен содержать только сопоставители Hamcrest, но если anyString является четвертым сопоставителем, я не вижу, где появляется пятый записанный сопоставитель.   -  person Jeff Bowman    schedule 19.08.2016


Ответы (1)


Проблема в том, что вы не можете использовать Mockito Matchers при вложении сопоставителей. Вместо этого вы должны использовать Hamcrest или другие пользовательские сопоставители. Основная проблема заключается в том, что argThat считается сопоставителем mockito, а также anyString(), и эти сопоставители применяются к одному аргументу, вызывающему ошибку (я понятия не имею, почему mockito не поддерживает это). Переход на сопоставитель Hamcrest для anyString должен решить проблему. Попробуйте следующее:

then(collector()).should().emit(eq(myStream), eq(myTuple),
    argThat(allOf(hasItem(isA(String.class)), hasItem("test1"), hasItem("test2"))));
person Taugenichts    schedule 07.08.2018