Как сопоставить возможный нулевой параметр в 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: