在单元测试DynamoDB PaginatedQueryList时如何返回列表

use*_*er7 6 java unit-testing mockito amazon-web-services amazon-dynamodb

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

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

我试图像测试

when(mapper.query(eq(MyClass.class), any(DynamoDBQueryExpression.class)))
                              .thenReturn((PaginatedQueryList<MyClass>) list);
Run Code Online (Sandbox Code Playgroud)

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

但是它抛出

java.lang.ClassCastException:无法将java.util.ArrayList强制转换为com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList

清单执行后如何发送mappper.query(..)

目的是entries在执行时将我构造的列表发送给该列表mapper.query(..)

注意:

我也尝试发送mockedPaginatedQueryList,但是当entries.stream()我想要发送实际流时。我试过像

when(paginatedQueryList.stream()).thenReturn(Stream.of(list.get(0), list.get(1)));
Run Code Online (Sandbox Code Playgroud)

它抛出

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

笔记2:

我用entries.stream()两次逻辑来测试

Mik*_*Hay 18

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

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

这将返回一个PaginatedQueryList将所有方法调用转发到list.

  • 我正在努力模拟“DynamoDBMapper”类上的“query”方法。这太棒了! (2认同)

use*_*er7 5

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

when(paginatedQueryList.stream()).thenReturn(list.stream()).thenReturn(list.stream());
Run Code Online (Sandbox Code Playgroud)

欢迎任何更好的方法。