如何在单元测试 DynamoDB 分页查询列表时返回列表

我有一个返回 a 的查询语句,并将其分配给 List。然后我对列表进行操作。PaginatedQueryList

List<MyClass> entries= mapper.query(MyClass.class, queryExpression);
//Logic to test
Map<String, Map> map = entries.stream()
                        .collect(Collectors.toMap(MyClass::getA, MyClass::getB));
....
....

我试图测试它,就像

when(mapper.query(eq(MyClass.class), any(DynamoDBQueryExpression.class)))
                              .thenReturn((PaginatedQueryList<MyClass>) list);

其中(ArrayList)是我自己构造的,并希望将其传递给主程序以测试主逻辑。listList<MyClass>

但它抛出

java.lang.ClassCastException: java.util.ArrayList 不能 cast to com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList

如何在执行时发送列表。mappper.query(..)

动机是将我在执行时构建的列表发送到 。entriesmapper.query(..)

注意:

我还尝试发送PaginatedQueryList,但是当它这样做时,我想发送实际的流。我试过像mockedentries.stream()

when(paginatedQueryList.stream()).thenReturn(Stream.of(list.get(0), list.get(1)));

它抛出

java.lang.IllegalStateException:stream 已经在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229) 上操作或关闭了

注2:

我在逻辑中使用了两次来测试entries.stream()


答案 1

Mockito为此提供了一些强大的工具。

List<MyClass> list = new ArrayList<>();
when(mapper.query(eq(MyClass.class), any(DynamoDBQueryExpression.class)))
    .thenReturn(mock(PaginatedQueryList.class, withSettings().defaultAnswer(new ForwardsInvocations(list))));

这将返回一个 mocked,它将所有方法调用转发到 。PaginatedQueryListlist


答案 2

我能够通过发送模拟然后发送两次(对于的每次访问)来解决问题。PaginatedQueryListlist.stream()entries.stream()

when(paginatedQueryList.stream()).thenReturn(list.stream()).thenReturn(list.stream());

欢迎任何更好的方法。


推荐