带有接口参数和 Mockito 参数捕获的方法

Method with Interface Parameters with Mockito Argument Capture

我有一个简单的问题。我有两个 classes

XMessageYMessage。这两个 class 是 ZClass 的子 class。

这些消息是从 PublisherService 使用方法

发布的
public void publish(ZClass message, Properties props){
     // some lowlevel stuff.
     // note that method is taking ZClass as an arg.
}

根据我的逻辑,XMessage 发送了多次,而 YMessage 在一次测试中只发送了一次。

假设 XMessage 应该发送 4 次,而 YMessage 应该发送 1 次。我假设下面的代码可以工作。

        ArgumentCaptor<XMessage> xCaptor = ArgumentCaptor.forClass(XMessage.class);

        verify(publisherService, times(4)).sendMessage(isA(XMessage.class),any());
        verify(publisherService, times(1)).sendMessage(isA(YMessage.class),any());
        verify(publisherService, times(4)).sendMessage(xCaptor,any());

但是捕获器失败并且捕获器有 5 个值。

我做错了什么?

提前致谢。

这是 Mockito 中的一个已知问题。问题是 ArgumentCaptor 无法识别类型。

https://github.com/mockito/mockito/issues/565

这是从 2016 年开始开放的,但仍未完全修复,所以我只是做了一些解决方法。

您可以捕获所有参数,然后 instanceof 仅捕获您需要的参数。

ArgumentCaptor<ZClass> zCaptor = ArgumentCaptor.forClass(ZClass.class);

Mockito.verify(publisherService, times(5)).publish(zCaptor.capture(), ArgumentMatchers.<Properties>any());

List<XMessage> xMessages = zCaptor.getAllValues()
                                  .stream()
                                  .filter(arg -> arg instanceof XMessage)
                                  .map(arg -> (XMessage) arg)
                                  .collect(Collectors.toList());