it-swarm.com.ru

Использование универсального метода any () от Mockito

У меня есть интерфейс с методом, который ожидает массив Foo:

public interface IBar {
  void doStuff(Foo[] arr);
}

Я издеваюсь над этим интерфейсом, используя Mockito, и я хотел бы утверждать, что doStuff() вызывается, но я не хочу проверять, какой аргумент передан - "все равно".

Как мне написать следующий код, используя универсальный метод any() вместо anyObject()?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
173
ripper234

Поскольку Java 8, вы можете использовать метод без аргументов any, и аргумент типа будет выведен компилятором:

verify(bar).doStuff(any());

Объяснение

Новое в Java 8 состоит в том, что целевой тип выражения будет использоваться для вывода параметры типа его подвыражений. До Java 8 только аргументы методов, которые используются для вывода параметров типа (большую часть времени).

В этом случае тип параметра doStuff будет целевым типом для any(), а тип возвращаемого значения any() будет выбран в соответствии с этим типом аргумента.


Примитивные типы

К сожалению, это не работает с примитивными типами:

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, и возникнет исключение.

87
Lii

Это должно работать

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));
262
jitter

Вы можете использовать Mockito.isA() для этого:

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA (java.lang.Class)

10
thilko

Поскольку мне нужно было использовать эту функцию для моего последнего проекта (когда-то мы обновили с 1.10.19), просто чтобы удержать пользователей (которые уже используют mockito-core версия 2.1.0 или выше ) до настоящего времени статические методы из приведенных выше ответов должны быть взяты из класса ArgumentMatchers:

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

Пожалуйста, имейте это в виду, если вы планируете обновлять артефакты mockito, возможно, начиная с версии 3, этот класс может больше не существовать:

В соответствии с 2.1.0 и выше, javadoc org.mockito.Matchers заявляет:

Используйте org.mockito.ArgumentMatchers. Этот класс теперь устарел, чтобы избежать конфликта имен с классом Hamcrest * org.hamcrest.Matchers. Этот класс, скорее всего, будет удален в версии 3.0.

4
Maciej Kowalski