Оскільки в 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
метод повинен просто працювати. Ви не шукаєте відповіді на речі, які просто працюють!