針對異步編寫單元測試永遠看起來不錯。
需要testMyAsyncMethod()
(主線程)阻塞,直到您準備好檢查正確的行爲。這是必要的,因爲測試用例在方法結束時終止。所以沒有辦法解決,問題只是你如何屏蔽。
不影響多大生產代碼的直接方法是 使用while循環:asume AsyncManager是被測類:
ArrayList resultTarget = new ArrayList();
AsyncManager fixture = new AsyncManager(resultTarget);
fixture.startWork();
// now wait for result, and avoid endless waiting
int numIter = 10;
// correct testcase expects two events in resultTarget
int expected = 2;
while (numIter > 0 && resulTarget.size() < expected) {
Thread.sleep(100);
numIter--;
}
assertEquals(expected, resulTarget.size());
生產代碼將使用apropriate目標AsyncManager或構造使用另一個構造函數。爲了測試目的,我們可以通過我們的測試目標
您只會將其寫入固有的異步任務,如您自己的消息隊列。 其他代碼,只有統一執行計算任務的類的核心部分(特殊算法等),您不需要讓它在線程中運行。
但是,對於您的搜索監聽器而言,顯示的循環和等待原則是適當的。
public class SearchTest extends UnitTest implements SearchListener {
public void searchFinished() {
this.isSearchFinished = true;
}
public void testSearch1() {
// Todo setup your search listener, and register this class to receive
Searcher searcher = new Searcher();
searcher.setListener(this);
// Todo setup thread
searcherThread.search();
asserTrue(checkSearchResult("myExpectedResult1"));
}
private boolean checkSearchResult(String expected) {
boolean isOk = false;
int numIter = 10;
while (numIter > 0 && !this.isSearchFinished) {
Thread.sleep(100);
numIter--;
}
// todo somehow check that search was correct
isOk = .....
return isOk;
}
}
你想要測試什麼?搜索,還是你的排隊機制? –
搜索,更具體地說,我需要我的搜索查詢來提供預期的結果。我想將假後端「注入」到搜索組件中,以便測試它如何響應API服務器的回調。 –
如果你使用mockito,你可以創建一個'Answer',它在返回結果前休眠;不知道這是否對你有幫助? – fge