Я пытался заставить смоделировать метод с параметрами vararg, используя Mockito:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
Это не работает, однако, если я делаю это вместо этого:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Это работает, несмотря на то, что я полностью пропустил аргумент varargs при создании метода.
Есть какие-нибудь подсказки?
java
mocking
variadic-functions
mockito
qualidafial
источник
источник
Ответы:
В Mockito 1.8.1 введено сопоставление anyVararg () :
Также смотрите историю этого: https://code.google.com/archive/p/mockito/issues/62
Изменить новый синтаксис после устаревания:
источник
anyVararg()
имеет Object в качестве возвращаемого типа. Чтобы сделать его совместимым с любыми типами var arg (например, String ..., Integer ... и т. Д.), Выполните явное приведение. Например, если у вас есть,doSomething(Integer number, String ... args)
вы можете сделать код макета / заглушки с чем-то вродеwhen(mock).doSomething(eq(1), (String) anyVarargs())
. Это должно позаботиться об ошибке компиляции.Matchers
теперь устарела во избежание конфликта имен сorg.hamcrest.Matchers
классом и, скорее всего, будет удалена в mockito v3.0. ИспользуйтеArgumentMatchers
вместо этого.Несколько недокументированная функция: если вы хотите разработать собственный Matcher, который соответствует аргументам vararg, вам нужно, чтобы он реализовал
org.mockito.internal.matchers.VarargMatcher
его правильно. Это пустой интерфейс маркера, без которого Mockito не сможет корректно сравнивать аргументы при вызове метода с varargs с использованием вашего Matcher.Например:
источник
Основываясь на ответе Эли Левайна, вот более общее решение:
Затем вы можете использовать его с сопоставителями массивов Hamcrest следующим образом:
(Очевидно, что статический импорт сделает это более читабельным.)
источник
Я использовал код в ответе Питера Уэстмакотта, однако с помощью Mockito 2.2.15 теперь вы можете делать следующее:
verify(a).method(100L, arg1, arg2, arg3)
где
arg1, arg2, arg3
вараггиисточник
Опираясь на ответ Топчефа,
Для 2.0.31-бета я должен был использовать Mockito.anyVararg вместо Matchers.anyVararrg:
источник
В моем случае подпись метода, который я хочу захватить его аргумент:
В этом случае вы должны явным образом привести к байтовому массиву :
Я использую версию mockito
1.10.19
источник
Вы также можете перебрать аргументы:
например, проверьте их типы и приведите их соответствующим образом, добавьте в список или что-то еще.
источник
Приспосабливая ответ от @topchef,
В соответствии с документами Java для Mockito 2.23.4, Mockito.any () «Совпадает с чем угодно, включая нули и переменные».
источник
Это можно сделать, передав захват ArgumentCaptor, а затем получив varargs в виде списка с помощью «getAllValues», см. Https://stackoverflow.com/a/55621731/11342928.
источник