java 如何模拟ElasticSearch的BulkResponse类

lztngnrs  于 2023-02-20  发布在  Java
关注(0)|答案(2)|浏览(188)

如何模拟下面方法的实现,我无法模拟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});
}
zpgglvta

zpgglvta1#

您似乎遇到了一个问题,特别是在for循环中模拟迭代。
for循环可用于实现Iterable接口的类,因为它使用其方法iterator()。您需要使用包含BulkItemResponse示例的列表的迭代器模拟BulkResponse的此方法。

vkc1a9a2

vkc1a9a22#

不模仿它更容易,只要使用BulkResponse的真实的示例即可。
在这种情况下,模仿是一件麻烦事,查看该类的source code,您所要做的就是创建一个新的BulkResponse,并将BulkResponseItem作为参数。
所以就这样吧。这样会干净很多:

new BulkResponse(new BulkItemResponse[]{item1, item2}, 1L);

如果你真的想这么做,这个类实现了Iterable接口,所以你需要模拟iterator()方法,for each循环实际上调用了iterator()

相关问题