Использование общего метода Mockito "any()"
у меня есть интерфейс с методом, который ожидает массив Foo:
public interface IBar {
void doStuff(Foo[] arr);
}
я издеваюсь над этим интерфейсом с помощью Mockito, и я хотел бы утверждать, что doStuff() вызывается, но я не хочу проверять, какой аргумент передается - "все равно".
Как написать следующий код с помощью any(), общий метод, вместо anyObject()?
IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
4 ответов:
начиная с 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, и исключение выбрасывается.
Это должно работать
import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; verify(bar).DoStuff(any(Foo[].class));
можно использовать
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)
поскольку мне нужно было использовать эту функцию для моего последнего проекта (в какой-то момент мы обновились с 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 организации.mockito.Государства-вычислителей:
использовать
org.mockito.ArgumentMatchers. Этот класс теперь устарел для того, чтобы избегайте столкновения имени с Hamcrest*org.hamcrest.Matchersкласс. Этот класс, скорее всего, будет удален в версии 3.0.
Comments