在多线程中使用easymock

Sta*_*lin 6 java testing multithreading easymock

我想测试一些方法会在失败时被召回.调用在单独的线程中执行.所以我写这样的代码

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);
Run Code Online (Sandbox Code Playgroud)

并且测试通过.但我还没有实现召回.

为了使测试失败,我更换了

 mock.bar();
 expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION"));
Run Code Online (Sandbox Code Playgroud)

 mock.bar();
 expectLastCall().andAnswer(new IAnswer<Void>() {
        @Override
        public Void answer() throws Throwable {
            sleepSomeTime();
            throw new RuntimeException("TEST EXCEPTION");
        }
    });
Run Code Online (Sandbox Code Playgroud)

但我不喜欢在我的测试中添加sleepSomeTime.除此之外,我实际上并不理解,虽然它在这种特殊情况下有所帮助.所以,

添加延迟为何有帮助?

这样做的正确方法是什么?

Chr*_*sel 6

我的方法是使用锁.您的帖子中没有足够的信息来显示确定的内容,但它可能看起来像这样:

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);
Run Code Online (Sandbox Code Playgroud)

这里的要点是第二个lock()调用被阻止,直到你的模拟解锁释放锁.