[英]Using easymock in multithreading
我想測試一些方法會在失敗時被召回。 調用在單獨的線程中執行。 所以我寫這樣的代碼
final Foo mock = createStrictMock(Foo.class);
mock.bar();
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION"));
mock.bar();
replay(mock);
doStuff();
sleepSomeTime(); //Pretty dirty. But I need to test it in multithreading.
verify(mock);
並且測試通過。 但我還沒有實現召回。
為了使測試失敗,我更換了
mock.bar();
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION"));
同
mock.bar();
expectLastCall().andAnswer(new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
sleepSomeTime();
throw new RuntimeException("TEST EXCEPTION");
}
});
但我不喜歡在我的測試中添加sleepSomeTime。 除此之外,我實際上並不理解,雖然它在這種特殊情況下有所幫助。 所以,
添加延遲為何有幫助?
這樣做的正確方法是什么?
我的方法是使用鎖。 您的帖子中沒有足夠的信息來顯示確定的內容,但它可能看起來像這樣:
final Lock lock = new Lock();
lock.lock();
expectLastCall().andAnswer(new IAnswer<Void>() {
@Override public Void answer() throws Throwable {
lock.unlock();
throw new RuntimeException("TEST EXCEPTION");
}
});
doStuff();
lock.lock();
verify(mock);
這里的要點是第二個lock()調用被阻止,直到你的模擬解鎖釋放鎖。
在多線程上下文中沒有簡單的方法來執行單元測試。
但我建議你閱讀另一個類似問題的答案 。 DRTestUtils
提供了一些方便的方法來隱藏更好的waitForCondition
方法調用后面的Thread.sleep
。
你有沒有嘗試使用搖擺工人?
您可能還想嘗試的是,如果您正在等待,那么您可能希望嘗試使用notify
或使用synchronized
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.