2013-09-22 65 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”被调用。你的类必须有一些必需的行为,这并不一定取决于内部调用的方法。难道你不能只是测试行为,而不是测试实现细节? –