使用 Mockito 匹配对象数组

2022-09-03 06:53:17

我正在尝试为一个获取 Request 对象数组的方法设置一个 mock:

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());

但我可以看出这些模拟没有被调用。

它们都会导致以下错误:

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}
);

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


答案 1

所以我很快把一些东西放在一起,看看我是否能找到你的问题,下面不能是我使用any(Class)匹配器的示例代码,它的工作原理。所以有些东西我们没有看到。

测试用例

@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()))


推荐