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

时间:2012-06-03 18:36:23

标签: java multithreading junit semaphore

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

    @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。从理论上讲,我可以添加钩子来终止它,但这会污染代码库,只使用我想要避免的测试代码。

2 个答案:

答案 0 :(得分:1)

你应该嘲笑信号量。你伪造的信号量应该抛出InterruptedException

答案 1 :(得分:0)

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

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

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

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