Соответствие массива объектов с помощью Mockito
Я пытаюсь настроить макет для метода, который принимает массив объектов Request:
client.batchCall(Request[])
Я пробовал эти два варианта:
when(clientMock.batchCall(any(Request[].class))).thenReturn(result);
...
verify(clientMock).batchCall(any(Request[].class));
и
when(clientMock.batchCall((Request[])anyObject())).thenReturn(result);
...
verify(clientMock).batchCall((Request[])anyObject());
Но я могу сказать, что mocks не вызывается.
Они оба приводят к следующей ошибке:
Argument(s) are different! Wanted:
clientMock.batchCall(
<any>
);
-> at com.my.pkg.MyUnitTest.call_test(MyUnitTest.java:95)
Actual invocation has different arguments:
clientMock.batchCall(
{Request id:123},
{Request id:456}
);
Почему совпадение не соответствует массиву? Есть ли специальный помощник, который мне нужно использовать для сопоставления массива объектов? Самое близкое, что я могу найти, это AddMartches.aryEq(), но для этого требуется указать точное содержимое массива, чего я бы не хотел делать.
Ответы
Ответ 1
Итак, я быстро поставил что-то вместе, чтобы узнать, могу ли я найти вашу проблему, и не может ниже мой пример кода использовать любой (класс), и он работал. Так что мы чего-то не видим.
Тестовая версия
@RunWith(MockitoJUnitRunner.class)
public class ClientTest
{
@Test
public void test()
{
Client client = Mockito.mock(Client.class);
Mockito.when(client.batchCall(Mockito.any(Request[].class))).thenReturn("");
Request[] requests = {
new Request(), new Request()};
Assert.assertEquals("", client.batchCall(requests));
Mockito.verify(client, Mockito.times(1)).batchCall(Mockito.any(Request[].class));
}
}
класс клиента
public class Client
{
public String batchCall(Request[] args)
{
return "";
}
}
Класс запроса
public class Request
{
}
Ответ 2
Некропостинг, но проверьте, называется ли метод, который вы вызываете, как batchCall(Request[] requests)
или batchCall(Request... requests)
.
Если это последний, попробуйте when(clientMock.batchCall(Mockito.anyVararg()))
.