2016-06-09 78 views
2

所以我有一些端點服務器代碼,在那裏我想異步運行的東西。爲此我使用期貨。有跡象表明,導致結果的任務,但也有不昂貴的IO任務,所以我在火災執行它們,忘記未來,像這樣:那斯卡拉測試用火和忘記期貨

import scala.concurrent.Future 

val ec = scala.concurrent.ExecutionContext.global 

Future { 
    Thread.sleep(10000) 
    println("Done") 
}(ec) 

println("Exiting now") 

輸出是:

import scala.concurrent.Future 

ec: scala.concurrent.ExecutionContextExecutor = [email protected] 

res0: scala.concurrent.Future[Unit] = [email protected] 

Exiting now 
res1: Unit =() 

通常在服務器上這並不是什麼大問題,因爲上下文在接收其他任務時保持運行,所以IO可以完成。但是當我測試時,測試結束並且裏面的任務開始投擲,因爲他們使用的服務變得不可用。

所以問題是:我該如何等待這些大火併忘記未來,同時又阻止我的主要執行?

+0

你一定要阻止主執行。 – Nyavro

+0

你也可以粘貼測試代碼。 – curious

+0

@Nyavro我真的不想那麼做。錯誤記錄在服務器上,並且不需要傳播到客戶端。如果我等待IO,我們正在討論將響應時間增加3-5秒。 – mirosval

回答

2

爲了說明我的答案,讓我們想象一下你訪問一些fileService來加載文件在一個不容忽視的部分,並且你爲你的單元測試使用Mockito(或其他模擬框架,這個想法保持不變)。然後,我會提到我的解釋代碼看起來類似的東西:

class SystemUnderTest(val fileService: MyFileService) { 
    def testedMethod(): GoodResult = { 
    val file = // ... some logic to extract file ... 
    Future { 
     fileService.uploadFile(file) 
    } 
    // ... other logic returning an instance of GoodResult 
    } 
} 

然後,在您的測試組合在org.scalatest.Eventually,並作出這樣的斷言:

eventually { 
    verify(fileService).uploadFile(any()) 
} 

它將確保主進程不會退出,然後才能驗證上傳器服務已被調用(或由implicit patienceConfig定義的超時已過期)。


,當然,你總是有返回以後你不要在你的產品代碼等待,等待它在測試中的選項。