2012-06-03 14 views
0

我有一个我想测试的方法的实现。如何从JUnit线程中断信号量?

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

+1

请你解释一下,你要当你的方法是在semaphore.acquire等待()从JUnit测试调用semaphore.release(); ? – dbf

+0

它只是测试JMS消息传递的代码片段,以确保在我期望的时候发送和处理所有消息。完整的源代码是在这里:https://github.com/trajano/maven-jee6/blob/master/maven-jee6-test/src/main/java/net/trajano/maven_jee6/test/LatchedMessageListener.java –

+0

我可以测试它的工作原理,但我无法测试信号量会导致异常中断的情况。 –

回答

1

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

+0

不幸的是信号量是在类中创建的,没有必要公开它使用信号量的事实。所以,如果我按照你的建议做了什么,那么我只是为了测试而在API中增加了一些额外的东西。 –

+0

1)你需要触发信号量(内部对象)。这意味着您已经在测试内部/实现特定的行为。 2)你不必改变API - 有很多改变私有变量的技术。 3)改变api进行测试没有任何问题。 api总是应该设计考虑测试。只需添加包范围setSemapthore或提取做信号量的方法,然后进行部分嘲弄。你需要修改你的设计来让你的代码可测试 – piotrek

0

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

另一种选择是使用多线程这一点。 已经线程调用onMessage,并且在它的侦听器信号线程2中调用onMessage,然后阻塞,直到线程2完成。 已经线程两个块,直到线程1对信号量有一个锁。然后它应该中断自己并调用onMessage。一旦它得到预期的运行时异常,它应该发信号线1停止阻塞。

我会用两个CountDownLatches有两个线程通信。

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