带有接口参数和 Mockito 参数捕获的方法
Method with Interface Parameters with Mockito Argument Capture
我有一个简单的问题。我有两个 classes
XMessage
和 YMessage
。这两个 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());
我有一个简单的问题。我有两个 classes
XMessage
和 YMessage
。这两个 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());