Mockito ArgumentMatcher any Object []

Мне нужен ArgumentMatcher, принимающий значения любого типа в массиве объектов (Object []). TestObject:

class ObjectArrayMethod {
    public int call(Object... objects) {
        return 0;
    }
}

Я пробовал это, где все assertEquals терпят неудачу:

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Object[] arg = {"", ""};
    Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
    int actual = method.call(arg);
    assertEquals(15, actual);

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Mockito.when(method.call(any(Object[].class))).thenReturn(15);
    Object[] arg = new Object[] {null, null};
    int actual = method.call(arg);
    assertEquals(15, actual);

даже в случае неудачи:

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Object[] arg = {"", ""};
    Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
    int actual = method.call(arg);
    assertEquals(15, actual);

Я написал собственный Матчер:

    protected static class ObjectArrayArgumentMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {

    private static final long serialVersionUID = 3846783742617041128L;
    private final Object[] values;
    private ErrorState errorState = NO_ERROR;

    protected ObjectArrayArgumentMatcher(Object[] values) {
        this.values = values;
    }

    @Override
    public boolean matches(Object[] argument) {

        if (values == null) {
            return true;
        }

        if (argument == null) {
            return false;
        }

        return true;
    }

}

а также

    protected static class ObjectArrayArgumentMatcher2 extends ObjectArrayArgumentMatcher {

    private static final long serialVersionUID = 3085412884910289910L;

    protected ObjectArrayArgumentMatcher2(Object... values) {
        super(values);
    }

    @Override
    public boolean matches(Object... argument) {
        return super.matches(argument);
    }

}

Который я инициализирую нулевыми значениями. Но меня не зовут.

Конечно, следующим шагом будет сравнение аргументов.

Почему соседи не вызывают совпадений (аргумент Object []) или совпадений (аргумент Object ...) с аргументами {"", ""} или даже {null, null}?

Мне нужен ArgumentMatcher, который работает с любым массивом объектов, даже со смешанными типами, такими как {"String", 1, new Object ()}.

Наконец, я хочу поиздеваться над методом:

int org.springframework.jdbc.core.JdbcTemplate.update(String sql, Object... args) throws DataAccessException

Я использую

            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.22.0</version>

Кстати. с версией 1.10.19 мой ObjectArrayArgumentMatcher работал.

Хотя на заголовок вашего вопроса, похоже, просто отвечает anyVararg() (устарело в пользу any с версии 2.2), на ваш вопрос можно лучше ответить с помощью этот другой вопрос SO о применении eq к varargs. Если этого достаточно, ответьте, и я отмечу этот вопрос как дубликат этого. (Также будьте осторожны: == проверяет ссылочное равенство только для ссылки на массив, но не для его содержимого.) Ура!

Jeff Bowman 04.10.2018 00:22

Спасибо за ваш ответ. Подобный пост был прототипом для моего ObjectArrayArgumentMatcher. Это больше не работает в mockito 2.22.0. ArgumentMatcher теперь является интерфейсом, а метод совпадений является общим.

Markus Kreth 04.10.2018 01:14

По крайней мере, кто-то успешно издевался над int org.springframework.jdbc.core.JdbcTemplate.update (String sql, Object ... args), возвращая 1 при вызовах?

Markus Kreth 04.10.2018 21:04

@JeffBowman: На самом деле это дубликат, как вы предложили. Я просто не понял.

Markus Kreth 06.10.2018 07:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
4 771
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец, этот пост помог мне найти решение: Как правильно сопоставить varargs в Mockito

Это работает:

Mockito.when(method.call(ArgumentMatchers.<Object>any())).thenReturn(10);

Другие вопросы по теме