2016-03-06 66 views
1

一個異步的副作用我有一個簡單的場景,我做第三方服務的一些工作,如果他們中的一個出現了故障,那麼我想清理做了什麼。如何測試與Scala和的Mockito

客戶並不需要等待清理完成,因此清理工作作爲一個側面影響,異步函數得到迴應。

在使用我的Mockito要verify的清理方法被調用,但我得到一個競爭條件和非確定性測試。

這裏是代碼片段:

val eventualImage = imageService.saveImage(uploadedImage, None, parent, imageActions) 
ScalaFutures.whenReady(eventualImage.failed, timeout(6 seconds), interval(15 millis)) { ex => 
    val x = Mockito.verify(mockS3Repository, Mockito.times(1)).deleteFileFromS3(s3Location) // where this function is pure async and nothing is waiting for her to complete 
    ex shouldBe a [exception.type] 
} 

有什麼辦法,我可以等待它與出改變我的代碼完成?

+2

包裹在'最終{}'? –

+3

最終找到了解決方案 – Gleeb

回答

2

正如@Lodewijk Bogaards在他的評論中所建議的那樣。 使用最終塊解決了我的問題。

這裏有一個例子:

首先添加with Eventually到類聲明

再從問題的代碼會像這樣完成的:

 val eventualImage = imageService.saveImage(uploadedImage, None, parent, imageActions) 
     ScalaFutures.whenReady(eventualImage.failed, timeout(6 seconds), interval(15 millis)) { ex => 
     ex shouldBe a [exception.type] 
     eventually(timeout(6 seconds), interval(15 millis)){ 
      Mockito.verify(mockS3Repository, Mockito.times(1)).deleteFileFromS3(s3Location) 
     } 
     } 
2

您可以通過調用timeout方法做timeout-based verification

Mockito.verify(mockS3Repository, Mockito.timeout(5000)).deleteFileFromS3(s3Location) 

雖然你不應該需要times(1),因爲它是默認的行爲,可以通過調用timeout(5000).times(1)等一起鏈上的兩個。