2013-09-22 62 views
1

我想寫一個junit來測試我的代碼中使用java監視器。有沒有一種方法可以斷言wait()已經在特定的對象上被調用過。我嘗試了obj和mockito間諜的不同組合來部分存根,但它要麼引發IllegalMonitorStateException,要麼只是繼續等待而不是捕獲方法調用。Junit - 測試調用obj.wait()

public void waitTest(){ 
    RWLock lock= new RWLock(); 
    RWLock lockSpy = spy(lock); 

    lock.lockRead(); 
    synchronized (lockSpy) { 
     verify(lockSpy).wait(); 
    } 
} 

class RWLock{ 
    public synchronized void lockRead(){ 
     wait(); 
    } 
} 

我真的很感謝任何幫助,我可以得到這一點。謝謝!

+0

向我們展示mockito代碼。 –

+0

我在這裏使用mockito間諜: RWLock lockSpy = spy(lock); //創建一個間諜 和 verify(lockSpy).wait(); //查看 – mindreader

回答

2

你的問題是wait()是最終的。 Mockito無法驗證最終方法。

+0

好的,我明白了。有沒有其他方法可以做到這一點?說,使用powermock? – mindreader

+0

@mind這不是一個框架限制。這是一個代理限制。由於該方法是最終的,因此無法(很容易)代理。 –

+1

我不是PowerMock專家,所以我不能發表評論。它很可能會起作用。你可以試試它。但是這裏有一個更大的問題。我不明白你爲什麼要測試「wait」被調用。你的類必須有一些必需的行爲,這並不一定取決於內部調用的方法。難道你不能只是測試行爲,而不是測試實現細節? –