Начиная с Java 8 вы можете использовать метод без аргументов, any
и аргумент типа будет выведен компилятором:
verify(bar).doStuff(any());
объяснение
Новым в Java 8 является то, что целевой тип выражения будет использоваться для определения параметров типа его подвыражений. До Java 8 только аргументы методов, которые использовались для вывода параметров типа (большую часть времени).
В этом случае тип параметра doStuff
будет целевым типом any()
, а тип возвращаемого значения any()
будет выбран в соответствии с этим типом аргумента.
Этот механизм был добавлен в Java 8 в основном для возможности компиляции лямбда-выражений, но в целом он улучшает вывод типов.
Примитивные типы
К сожалению, это не работает с примитивными типами:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Проблема в том, что компилятор будет выводить Integer
как возвращаемое значение any()
. Mockito не будет знать об этом (из-за стирания типа) и вернет значение по умолчанию для ссылочных типов, то есть null
. Среда выполнения попытается распаковать возвращаемое значение, вызвав intValue
метод перед его передачей doStuff
, и возникнет исключение.
any
метод должен просто работать. Вы не ищите ответ для вещей, которые просто работают!