Mockito - Verify the calling order

測試除了驗證執行結果以外,有時我們也會需要驗證方法的呼叫順序。舉例來說,在多執行緒存取一個method時,我們透過lock機制去避免race condition問題,同時我們又希望機於fair lock去確保順序性,以下是我們的待測程式:

public void method(int value) {
	try {
		lock.lock();
		handler.handle(value);
	} finally {
		lock.unlock();
	}
}

因此,單元測試除了會確認最後結果外,也會希望確認呼叫順序是否如預期。

我們的測試程式會產生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);
}