首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从JUnit线程中断信号量?

如何从JUnit线程中断信号量?
EN

Stack Overflow用户
提问于 2012-06-04 02:36:23
回答 2查看 1.1K关注 0票数 0

我有一个要测试的方法的实现。

代码语言:javascript
复制
    @Override
public void onMessage(final Message message) {
    try {
        LOG.fine("waiting on semaphore for " + message);
        semaphore.acquire();
        LOG.fine("semaphore acquired for " + message);
        listener.onMessage(message);
        LOG.fine(message + " processed");
    } catch (final InterruptedException e) {
        throw new RuntimeException(e);
    } finally {
        semaphore.release();
    }
}

然而,我不确定如何从JUnit测试中拼装InterruptedException。从理论上讲,我可以添加钩子来终止它,但这会污染代码库,因为代码只用于测试,而我希望避免这种情况。

EN

回答 2

Stack Overflow用户

发布于 2012-06-04 03:31:15

您应该模拟信号量。您伪造的信号量应该抛出InterruptedException

票数 1
EN

Stack Overflow用户

发布于 2012-06-04 21:38:05

在我的测试中,在调用onMessage之前中断当前线程会导致acquire方法抛出异常,即使它不需要阻塞,但我不知道这种情况是否会在所有jres中发生。

另一种选择是为此使用多个线程。让线程1调用onMessage,并在它的侦听器中通知线程2调用onMessage,然后阻塞,直到线程2完成。让线程2阻塞,直到线程1锁定信号量。然后,它应该中断自身并调用onMessage。一旦它得到了预期的运行时异常,它就应该向线程1发出停止阻塞的信号。

我会使用两个CountDownLatches让这两个线程进行通信。

如果测试失败,请确保终止这两个线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10872863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档