如何模拟下面方法的实现,我无法模拟BulkResponse。
public void aferBulk(long id, BulkRequest bulkRequest, BulkResponse bulkResponse) {
if(bulkResponse.hasFailures()) {
logFailedResponses(bulkResponse);
}else {
//some action
}
}
private void logFailedBulkItems(BulkResponse bulkResponse) {
for (BulkItemResponse bulkItemResponse : bulkResponse) {
if (bulkItemResponse.isFailed()) {
BulkItemResponse.Failure failure = bulkItemResponse.getFailure();
LOGGER.error("ES索引失败: {}", failure.getMessage());
}
}
}
}
我已经尝试过了,但是,我无法嘲笑下面的行
for (BulkItemResponse bulkItemResponse : bulkResponse)
模拟代码:
public void TestMethod(){
BulkResponse bulkResponse = mock(BulkResponse.class);
when(bulkResponse.hasFailures()).thenReturn(true);
when(response.hasFailures()).thenReturn(responseHasFailures);
BulkItemResponse item1 = mock(BulkItemResponse.class);
BulkItemResponse item2 = mock(BulkItemResponse.class);
when(item1.getItemId()).thenReturn(1);
when(item1.isFailed()).thenReturn(true);
BulkItemResponse.Failure failure = mock(BulkItemResponse.Failure.class);
when(failure.getMessage()).thenReturn("Bad message");
when(item1.getFailure()).thenReturn(failure);
when(item2.getItemId()).thenReturn(2);
when(item2.isFailed()).thenReturn(false);
when(response.getItems()).thenReturn(new BulkItemResponse[]{item1, item2});
}
2条答案
按热度按时间zpgglvta1#
您似乎遇到了一个问题,特别是在
for
循环中模拟迭代。for
循环可用于实现Iterable
接口的类,因为它使用其方法iterator()
。您需要使用包含BulkItemResponse
示例的列表的迭代器模拟BulkResponse
的此方法。vkc1a9a22#
不模仿它更容易,只要使用
BulkResponse
的真实的示例即可。在这种情况下,模仿是一件麻烦事,查看该类的source code,您所要做的就是创建一个新的
BulkResponse
,并将BulkResponseItem
作为参数。所以就这样吧。这样会干净很多:
如果你真的想这么做,这个类实现了
Iterable
接口,所以你需要模拟iterator()
方法,for each循环实际上调用了iterator()
。