0

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

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

4

2 回答 2

1

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

于 2012-06-03T19:31:15.360 回答
0

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

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

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

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

于 2012-06-04T13:38:05.150 回答