Java 使用Mockito匹配对象数组

Java 使用Mockito匹配对象数组,java,mocking,mockito,Java,Mocking,Mockito,我正在尝试为接受请求对象数组的方法设置模拟: client.batchCall(Request[]) 我试过这两种变体: when(clientMock.batchCall(any(Request[].class))).thenReturn(result); ... verify(clientMock).batchCall(any(Request[].class)); 及 但是我可以告诉你模拟没有被调用 它们都会导致以下错误: Argument(s) are different! Wante

我正在尝试为接受请求对象数组的方法设置模拟:

client.batchCall(Request[])
我试过这两种变体:

when(clientMock.batchCall(any(Request[].class))).thenReturn(result);
...
verify(clientMock).batchCall(any(Request[].class));

但是我可以告诉你模拟没有被调用

它们都会导致以下错误:

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}
);
参数不同!通缉:
clientMock.batchCall(
);
->com.my.pkg.MyUnitTest.call_test(MyUnitTest.java:95)
实际调用有不同的参数:
clientMock.batchCall(
{请求id:123},
{请求id:456}
);

为什么匹配器与数组不匹配?是否需要使用特殊的匹配器来匹配对象数组?我能找到的最接近的东西是AdditionalMatches.aryEq(),但这要求我指定数组的确切内容,我不想这样做。

所以我很快就把一些东西放在一起,看看是否能找到您的问题,下面是我使用any(Class)matcher的示例代码,它是有效的。因此,有些东西我们没有看到

测试用例

@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
{

}

但是检查您正在调用的方法是否声明为
batchCall(Request[]requests)
batchCall(Request…requests)


如果是后者,请尝试
当(clientMock.batchCall(Mockito.anyVararg())
让问题的作者决定它是否提供了问题的答案
Mockito.anyVararg()
不推荐使用时,请改用
(Type)Mockito.any()
public class Request
{

}