Как сопоставить возможный нулевой параметр в Mockito
Я пытаюсь проверить, что класс, который я тестирую, вызывает правильный метод класса зависимости. Поэтому я пытаюсь сопоставить параметры метода, но меня не волнуют фактические значения в этом тесте, потому что я не хочу, чтобы мой тест был хрупким.
Однако у меня возникают проблемы с его настройкой, поскольку Mockito решил, что поведение, которое я ожидаю, является ошибкой: https://github.com/mockito/mockito/issues/134
Так какой же правильный способ определения ArgumentMatcher
для параметра, который может быть null
?
Если проблема # 134" исправлена", этот код завершается ошибкой, потому что совпадения совпадают только в первом случае. Как определить средство сопоставления для работы во всех 4 случаях?
MyClass c = mock(MyClass.class);
c.foo("hello", "world");
c.foo("hello", null);
c.foo(null, "world");
c.foo(null, null);
verify(c, times(4)).foo(anyString(), anyString());
Ответы
Ответ 1
Я получил это для работы, переключившись на any(String.class)
Я считаю, что это немного вводит в заблуждение, потому что API, похоже, предполагает, что anyString()
является просто псевдонимом для any(String.class)
, по крайней мере, до обновления 2.0. Справедливости ради отметим, что в документации указано, что anyString()
соответствует только нулевым строкам. Это просто кажется мне интригующим.
Ответ 2
Из javadocs any()
Так как Mockito 2.1.0, разрешите только null-t21. Поскольку это является ссылкой с нулевым значением, предлагаемый API для соответствуетОболочка null
будет isNull()
. Мы чувствовали это изменение сделало бы тесты более безопасными, чем это было с Mockito 1.x.
Таким образом, способ сопоставления аргументов с нулевыми строками является явным объявлением:
nullable(String.class)
Ответ 3
Как насчет:
verify(c, times(4)).foo(anyObject(), anyObject());
Это работает для вас?
Matchers.anyObject() допускает null
s.
Ссылка в Документы Mockito: