我有一段与dynamoDb相关的代码,我想用mockito测试这些代码。
我想要测试的方法包含以下行:
List<NotificationFeedRecord> listResult = mapper.query(NotificationFeedRecord.class, queryExpression);
当我手工测试时,它工作得很好,我提交了一个查询,并从dynamodb获得了预期的结果。
我正在写单元测试,想模拟mapper.query.
我有:
mapper = mock(DynamoDBMapper.class);
List<NotificationFeedRecord> testList = new ArrayList<>();
when(mapper.query(any(), any())).thenReturn(testList);
这里我得到一个错误
Error:(133, 37) java: no suitable method found for thenReturn(java.util.List<notificationfeed.lib.db.NotificationFeedRecord>)
(argument mismatch; java.util.List<notificationfeed.lib.db.NotificationFeedRecord> cannot be converted to com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList<java.lang.Object>)
我尝试了一系列修复(例如,创建PaginatedQueryList并返回它,更改查询匹配器),但都出现了错误。
.query方法声明如下:
public <T> PaginatedQueryList<T> query(Class<T> clazz, DynamoDBQueryExpression<T> queryExpression) {
return query(clazz, queryExpression, config);
}
如何模拟mapper.query?它有什么特别的地方吗?
这真的很简单,我必须模拟PaginatedQueryList,然后:
when(mapper.query(any(), anyObject())).thenReturn(paginatedQueryList)
这对我很有效。
这些是我为我们的测试设置的所有条件:
@Mock private PaginatedQueryList paginatedQueryList;
doReturn(mockQuery).when(utilSpy).getQueryExpression();
when(mockQuery.withFilterExpression(anyString())).thenReturn(mockQuery);
when(mockQuery.withLimit(anyInt())).thenReturn(mockQuery);
when(mockQuery.withExpressionAttributeValues(anyMap())).thenReturn(mockQuery);
when(mockQuery.withIndexName(anyString())).thenReturn(mockQuery);
when(mockQuery.withHashKeyValues(anyString())).thenReturn(mockQuery);
when(mockQuery.withConsistentRead(anyBoolean())).thenReturn(mockQuery);
when(mockQuery.withRangeKeyCondition(anyString(), anyObject())).thenReturn(mockQuery);
when(mapper.query(any(), anyObject())).thenReturn(paginatedQueryList);
我认为您只是缺少了when()方法的正确匹配器。你可以这样做:
when(mapper.query(Matchers.anyListOf(NotificationFeedRecord.class), anyString()).thenReturn(testList);
anyListOf()匹配器的文档在这里