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



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



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


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



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



IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
918   4  

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

    Ничего не найдено.