【问题标题】:How to return a list when unit testing DynamoDB PaginatedQueryList单元测试 DynamoDB PaginatedQueryList 时如何返回列表
【发布时间】:2016-03-28 03:57:08
【问题描述】:

我有一个返回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&lt;MyClass&gt;(ArrayList),是我自己构造的,想传给主程序测试主逻辑。

但它会抛出

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

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

动机是在执行mapper.query(..)时将我构建的列表发送给entries

注意:

我也尝试发送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() 进行测试

【问题讨论】:

    标签: java unit-testing amazon-web-services mockito amazon-dynamodb


    【解决方案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))));
    

    这将返回一个模拟的PaginatedQueryList,它将所有方法调用转发到list

    【讨论】:

    • 我一直在努力模拟 DynamoDBMapper 类上的 query 方法。效果很好!
    • 这是救命稻草。谢谢。
    【解决方案2】:

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

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

    欢迎任何更好的方法。

    【讨论】:

    • 你能分享你实现这个的代码示例吗?分页查询列表从哪里来?而列表是我创建的列表。为什么 thenReturn 会执行两次?
    【解决方案3】:

    我的答案是在测试中模拟 PaginatedQueryList 的通用解决方案(可能对谷歌用户有用,因为这个主题没有太多答案)。

    对于我的测试,这是有效的:

        // 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() 方法。

    【讨论】:

    • 我试过了,但 query 方法没有被模拟,因为它返回 null。
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2013-07-08
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多