Мне нужен 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 работал.
Спасибо за ваш ответ. Подобный пост был прототипом для моего ObjectArrayArgumentMatcher. Это больше не работает в mockito 2.22.0. ArgumentMatcher теперь является интерфейсом, а метод совпадений является общим.
По крайней мере, кто-то успешно издевался над int org.springframework.jdbc.core.JdbcTemplate.update (String sql, Object ... args), возвращая 1 при вызовах?
@JeffBowman: На самом деле это дубликат, как вы предложили. Я просто не понял.




Наконец, этот пост помог мне найти решение: Как правильно сопоставить varargs в Mockito
Это работает:
Mockito.when(method.call(ArgumentMatchers.<Object>any())).thenReturn(10);
Хотя на заголовок вашего вопроса, похоже, просто отвечает
anyVararg()(устарело в пользуanyс версии 2.2), на ваш вопрос можно лучше ответить с помощью этот другой вопрос SO о примененииeqк varargs. Если этого достаточно, ответьте, и я отмечу этот вопрос как дубликат этого. (Также будьте осторожны:==проверяет ссылочное равенство только для ссылки на массив, но не для его содержимого.) Ура!