[英]Testing asynchronous code with JUnit
我想测试一些依赖网络传输的代码。 该代码发出请求并提供回调-请求完成后,将触发该回调。 我想模拟网络传输,并使用Thread.sleep
模拟一些延迟...但是,这当然会使整个测试暂停。
到目前为止,我一直在创建新线程并在整个测试中使用CountDownLatch
es来阻止测试在触发回调之前结束。 我的模拟网络对象创建了一个新线程,在该线程上休眠,然后触发回调。 这实际上工作得很好,但是问题在于回调中的任何断言错误都不会报告给原始的junit线程-相反,我在控制台上得到了异常文本,在这里很难理解和使用。
我希望有:
assertEquals
输出通过管道传递到主JUnit输出收集器的方法,或者 感谢您的任何想法!
当我必须实现类似于您的异步机制时,我创建了抽象类AsyncTestCase
,该类保留测试错误并提供特殊的方法waitForCallback()
。 当异步任务在预期结果中发现错误时,会将错误放入此变量中。 设置器在由waitForCallback()
使用的对象上调用notify()
waitForCallback()
。 因此,当回调到达时,它将立即导致测试唤醒。 然后,我可以调用所有断言,包括异步任务存储的断言。
并且不要忘记在测试中设置超时以防止它们永远休眠:
@Test(timeout=10000)
public void mytest() {
callAsyncTask();
waitForAsyncTask(); // from base class
assertAsyncTaskResult(); // from base class
}
您要描述的是ConcurrentUnit 。 这是一个例子:
final Waiter waiter = new Waiter();
new Thread(() -> {
doSomeWork();
waiter.assertTrue(true);
waiter.resume();
}).start();
// Wait for resume() to be called
waiter.await(1000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.