簡體   English   中英

在多線程中使用easymock

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM