Problem
測試除了驗證執行結果以外,有時我們也會需要驗證方法的呼叫順序。舉例來說,在多執行緒存取一個method時,我們透過lock機制去避免race condition問題,同時我們又希望機於fair lock去確保順序性,以下是我們的待測程式:
public void method(int value) { try { lock.lock(); handler.handle(value); } finally { lock.unlock(); } }
因此,單元測試除了會確認最後結果外,也會希望確認呼叫順序是否如預期。
How to?
我們的測試程式會產生40個thread來存取代測程式。第一個thread會透過latch讓handler處於等待的狀態,值到其餘39個threads都已開始執行才會解鎖,而這些thread會依序寫入1~40。第一個thread等待可以模擬39個thread同時lock的情況。接著就是主角,Mockito的Inorder物件;使用它來達成我們測試存取順序的目的:
InOrder order = Mockito.inOrder(handler); for( int i = 1 ; i <= 40 ; i++ ){ order.verify(handler).handle(i); }
留言
張貼留言