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.除此之外,我实际上并不理解,虽然它在这种特殊情况下有所帮助.所以,
添加延迟为何有帮助?
这样做的正确方法是什么?
我的方法是使用锁.您的帖子中没有足够的信息来显示确定的内容,但它可能看起来像这样:
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()调用被阻止,直到你的模拟解锁释放锁.