【问题标题】:Using easymock in multithreading在多线程中使用easymock
【发布时间】:2013-05-20 14:19:13
【问题描述】:

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

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

为什么添加延迟会有所帮助?

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

【问题讨论】:

    标签: java multithreading testing easymock


    【解决方案1】:

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

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

    【讨论】:

    • 这是最好的答案。但我认为这应该在没有锁的情况下完成。
    • 根据您的代码,您可以挂钩回调,以便您的验证方法在您模拟最后一行的回调中完成。
    【解决方案2】:

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

    但我建议您阅读此answer to another similar question。 DRTestUtils 提供了一些方便的方法来隐藏Thread.sleep 在更好的waitForCondition 方法调用后面。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 swing workers 来实现?

      如果您正在等待,您可能还想尝试使用notify 或synchronized 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多