2014-06-23 111 views
1

我有一個應用程序,它使用ExecutorService創建多個線程&異步執行某些操作。Java執行服務集成測試

for (final Product product : products) { 
    executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      updateFewAttributes(product); 
     } 
    }); 
} 

我正在嘗試編寫一個集成測試來驗證操作是否已正確執行。 由於操作是異步的,因此很難斷言預期的屬性。

試圖在asserting之前做awaitTermination,但這似乎不起作用。

executorService.awaitTermination(3, TimeUnit.MINUTES); 
+3

我認爲你必須在'awaitTermination'之前調用'shutdown'' – Thilo

回答

0

我會建議使用您自己的實現(或模擬)的ExecutorService,不會使用線程,而是模仿螺紋樣的行爲(或者可以使用的線程,但在可控制的方式)。這樣你就可以根據需要擁有儘可能多的控制權。

這當然取決於被測試的代碼是足夠可測試的,以便使用不同的ExecutorService進行測試而不是生產,即要麼將ExecutorService實例傳遞給它,要麼將其注入到它中。

+0

這應該是一個「集成」測試。 – Thilo

+0

這不是問題。你唯一「嘲笑」/「僞造」的是執行者服務,它(就我所知,你的問題)是一個標準的實現。換句話說,您的測試像往常一樣執行您的生產代碼,但不是使用您無法控制的外部API,而是使用一個可以控制的假代碼。這並不能改變被測代碼(你的代碼)是真實的事實。 – eitanfar

+0

我不知道......如果您假冒執行程序服務到您的代碼不再以併發/異步方式運行的程度,那麼您可能會遺漏線程安全中的細微問題(當然,取決於它們的細微程度,無論如何,用適量的測試你都不會抓住它們)。 – Thilo

0

ExecutorService會生成一個Future,您可以使用它來等待計算完成。根據ExecutorService文檔:

方法提交延伸鹼方法Executor.execute(了java.lang.Runnable)通過創建並返回一個可用於取消執行和/或等待完成的Future。

存放Future是你executorService.submit方法調用返回,然後在所有期貨調用Future#get()將確保您的Runnable將完成執行。根據Future#get()文檔:

等待如果必要的計算完成,然後檢索其結果。

在此之後做出斷言應該是安全的。

相關問題