【发布时间】:2012-07-11 14:47:42
【问题描述】:
我有一个非常简单的Checkclass,它有一个阻塞waitForCondition() 方法。这个方法是阻塞的。我想为此方法创建一些单元测试。首先,该方法应在满足条件时返回。其次,方法应该在被中断时返回。
Check 类在内部有一个ArrayBlockingQueue 并调用它的take() 方法,所以我的测试实际上是关于正确编码条件的逻辑(应该如此)。
在应用程序中,Check 类的数据由另一个线程通过InputData 方法提供。 InputData 方法对传入的数据执行逻辑,并在满足条件时在 ArrayBlockingQueue 中放置一个虚拟对象。这应该会导致 waitForCondition() 返回。
所以我的第一个想法是我可以通过模拟来测试InputData,并检查当条件满足时虚拟对象是否被添加到队列中。这将需要更改类的设计,因为队列是私有数据成员(除非可以模拟私有数据)。而不是InputData在满足条件时直接添加到队列中,它必须调用一些可以模拟的东西。
但是如果InputData 工作正常,那么检查waitForCondition() 方法本身就会出现问题。真的很简单的代码:
try {
myArrayBlockingQueue.take();
return true;
} catch (InterruptedException ex) {
return false;
}
所以我想知道是否值得想象的麻烦:一个测试用Check 创建另一个线程,调用它的waitForCondition(),然后在完成后返回一些东西。也许,使用 Executor 服务。模糊的部分是如何同步assertTrue(...)。我发现了这个article on asynchronous testing,看起来它可以解决问题。
问题总结:
- 我应该更改设计以测试
InputData()中的逻辑吗?如果可以,应该怎么做? - 只要测试了
InputData(),我是否应该忽略waitForCondition()的测试? - 还是只做需要做的事情(有点复杂的单元测试)并直接测试
waitForCondition()更好?
【问题讨论】:
标签: java multithreading unit-testing