单元测试dynamodb paginatedquerylist时如何返回列表

vd2z7a6w  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(433)

我有一个查询语句,它返回 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);

哪里 listList<MyClass> (arraylist)我自己构造并想把它传递给主程序来测试主逻辑。
但它抛出
java.lang.classcastexception:无法将java.util.arraylist转换为com.amazonaws.services.dynamodbv2.datamodeling.paginatedquerylist
执行时如何发送列表 mappper.query(..) .
动机是把我写的清单发给你 entries 执行时 mapper.query(..) .
注:
我还试着发了封信 mocked paginatedquerylist但当它 entries.stream() 我想发送实际的流。我试过了

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

它抛出
java.lang.illegalstateexception:流已在java.util.stream.abstractpipeline.evaluate(abstractpipeline)上操作或关闭。java:229)
注2:
我用 entries.stream() 两次在我的逻辑测试

bcs8qyzn

bcs8qyzn1#

mockito有一些强大的工具。

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

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

alen0pnh

alen0pnh2#

我通过发送mocked来解决这个问题 PaginatedQueryList 然后发送 list.stream() 两次(每次访问 entries.stream() ).

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

欢迎采用更好的方法。

vxf3dgd4

vxf3dgd43#

我的答案是在测试中模拟分页QueryList的通用解决方案(可能对Googler有用,因为这个主题没有太多答案)。
在我的测试中,这起到了作用:

// given
    List<UserDevice> expectedDevices = Arrays.asList(generateUserDevice(USER_ID, DEVICE_ID), generateUserDevice(USER_ID, "deviceId2"));

    PaginatedQueryList listMock = mock(PaginatedQueryList.class);
    when(listMock.listIterator()).thenReturn(expectedDevices.listIterator());
    when(mapper.query(eq(UserDevice.class), any(DynamoDBQueryExpression.class))).thenReturn(listMock);

    // when
    List<UserDevice> devices = dao.findAll(USER_ID);

    // then
    assertEquals(expectedDevices, devices);

所以,如您所见,我模拟了paginatedquerylist并模拟了它的listiterator()方法。

相关问题