2017-06-12 77 views
0

下面是碼片,我想測試無法嘲笑dynamoDBMapper.query

...

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下被捕獲,代碼在下一個業務邏輯上移動。這讓我覺得我可能沒有正確地嘲笑。我在這裏錯過了什麼。

+0

你確定你正確地設置了模擬嗎?代碼看起來很好......我能想到的唯一的事情就是你可能不會在使用db映射器的對象中設置模擬。 – AnthonyJClink

+1

Aslo,我注意到你正在嘲笑.scan方法......在你的實現中,有時你使用的是.query – AnthonyJClink

+0

,你知道你在做什麼是對的,但你忘記了你沒有咖啡因在最長的時間!那當你需要第二隻眼睛時......用'query'替換'scan'解決了問題:)請把你的文章寫成答案,以便我可以接受它作爲正確的答案。 –

回答

2

你的代碼看起來不過罰款我注意到,你在嘲諷.scan方法......在你實現你正在使用.query

我一般使用jmockit,在jmockit這樣做會導致一個空的對象是返回我認爲在mokito它最終會返回null。如果這是真的,一個NPE將被拋出,並且由於捕獲錯誤的異常,您的測試將繼續。