我有一个想要测试的方法的实现。
@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 测试中操纵中断异常。 从理论上讲,我可以添加钩子来终止它,但这会污染代码库,因为代码仅用于测试,我想避免这样做。
你应该模拟信号量。 你的伪造信号量应该抛出中断异常
在我的测试中,在调用 onMessage 之前中断当前线程,即使不需要阻止,也会导致获取方法抛出,但我不知道这是否会在所有 jre 中发生。
另一种选择是为此使用多个线程。让线程一个调用 onMessage,在它的侦听器中发出信号线程 2 调用 onMessage,然后阻塞,直到线程 2 完成。将线程二块,直到线程一在信号灯上具有锁定。 然后它应该中断自身并调用 onMessage。 一旦它得到预期的运行时异常,它应该发出信号线程 1 停止阻塞。
我会使用两个 CountDownLatches 来让两个线程进行通信。
如果测试失败,请确保终止两个线程。