6

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

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。除此之外,我真的不明白它在这种特殊情况下是否有帮助。所以,

为什么添加延迟有帮助?

做这些事情的正确方法是什么?

4

3 回答 3

7

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

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() 调用被阻塞,直到你的模拟中的解锁释放了锁。

于 2013-07-17T14:51:54.270 回答
0

在多线程上下文中执行单元测试没有简单的方法。

但我建议您阅读另一个类似问题的答案DRTestUtils提供了一些方便的方法来隐藏更好Thread.sleep的方法waitForCondition调用。

于 2013-07-22T19:00:02.700 回答
-1

您是否尝试过使用摇摆工人来实施?

此外,您可能想尝试的是,如果您正在等待,那么您可能想尝试使用notify或使用synchronized类。

于 2013-07-17T14:50:16.923 回答