在JUnit测试用例中,如何确保被测方法直接/间接产生的所有线程都完成了这些工作,以便我可以断言最终结果?
@Test
public void testMethod() {
Result result=method();// may spawn multiple threads to set result.value
Assert.assertTrue(result.getValue()==4); //should execute only after result.value is set to its final value.
}
发布于 2010-08-18 22:46:41
真正的问题是,在非测试代码中如何处理这种情况?何时设置result.value
,method()
的接口向调用者保证了什么?
在编写测试时请牢记这一点-其目的是断言类及其方法的行为与它们所宣传的一样。有时,找出所宣传的接口可能是挑战的一半。
在这种情况下,我强烈建议您的Result
对象的行为类似于Future
,因为它的get()
方法会阻塞,直到结果可用。(或者,给它一个waitFor()
方法或类似的方法)。
如果您的方法没有提供任何特定的保证或阻塞调用,那么您在测试中真正能做的就是在循环中每隔x秒检查一次该值,并在测试中放置一个@Timeout
以确保在“合理”时间内设置该值。但这也是客户端所能做的全部,所以
发布于 2010-08-18 23:50:19
我建议您在Thread#join ()中调用多个线程实例的方法,按照这种方式,所有子线程都完成了。
发布于 2010-10-26 01:07:39
处理此问题的一种方法需要两个步骤:
理想情况下,如果所有工作线程都没有在预期的时间范围内完成,您会希望主线程超时并导致测试失败。使用ConcurrentUnit实现这一点非常简单。
public class MyTest extends ConcurrentTestCase {
@Test
public void test() throws Throwable {
int threads = 5;
for (int i = 0; i < threads; i++) {
new Thread(new Runnable() {
public void run() {
threadAssertEquals(1, 1); // Perform assertions as needed
resume();
}
}).start();
}
threadWait(1000, threads); // Wait for 5 resume calls
}
}
https://stackoverflow.com/questions/3513104
复制相似问题