无法模拟dynamoDBMapper.query

时间:2017-06-12 22:10:55

标签: java unit-testing mockito

这是我要测试的一段代码

...

DynamoDBQueryExpression<Order> queryExpression = createQueryForLatestOrders(orderId, storeId, time);
PaginatedQueryList<Order> orders;
    try{
        orders = dynamoDBMapper.query(Order.class, queryExpression);
    } catch (AmazonServiceException ase){
        if (AmazonServiceException.ErrorType.Client.equals(ase.getErrorType())) {
            throw new InternalServiceException(ase);
        } else {
            throw new DependencyFailureException(ase);
        }
    } catch (AmazonClientException e) {
        throw new DependencyFailureException(e);
    }
  // other business logic

创建查询的功能就像这样定义

private DynamoDBQueryExpression<Order> createQueryForLatestOrders(String orderId, String storeId, LocalDateTime time) { // ... implementation // }

...

我试图像这样测试它

@Test(expected = DependencyFailureException.class)
public void testGetOrdersThrowsAWSServerException() throws Exception {
    when(mockDynamoDBMapper.scan(eq(Order.class), any())).thenThrow(AmazonServiceException.class);

    mockOrdersManager.getOrders(orderId, storeId, LocalDateTime.now());
}

但是代码不是被AmazonServiceException所捕获,而是移动到下一个业务逻辑上。这让我觉得可能我没有做正确的嘲笑。我在这里失踪了什么。

1 个答案:

答案 0 :(得分:2)

您的代码看起来很好但是我注意到您正在嘲笑.scan方法...在您的实现中,您正在使用.query

我通常使用jmockit,在jmockit这样做会导致返回一个空对象我认为在mokito中它最终会返回null。如果这是真的,则会抛出NPE,并且由于捕获到错误的异常,您的测试将继续。