使用JUnit测试异步代码

Ril*_*ark 8 java testing junit multithreading

我想测试一些依赖于网络传输的代码.代码发出请求并提供回调 - 当请求完成时,将触发回调.我想模拟网络传输,并Thread.sleep用来模拟一些延迟...但当然这将使整个测试暂停.

到目前为止,我一直在创建新线程并CountDownLatch在整个测试中使用es来阻止测试在回调被触发之前结束.我的模拟网络对象创建一个新线程,在该线程上休眠,然后触发回调.这实际上工作得很好,但问题是回调中的任何断言错误都没有报告给原始的junit线程 - 相反,我在控制台上获得了异常文本,在那里它更难理解和使用.

我希望有:

  1. 一种将assertEquals生成的线程输出管道传输到主JUnit输出收集器的方法,或者
  2. 在JUnit中测试线程代码的完全不同和更好的方法,或
  3. 一种在单个线程中模拟异步代码的方法

谢谢你的任何想法!

Ale*_*exR 4

当我必须实现与您类似的异步机制时,我创建了AsyncTestCase保存测试错误并提供特殊方法的抽象类waitForCallback()。当异步任务在预期结果中发现错误时,会将错误放入此变量中。setter 调用notify()所使用的对象waitForCallback()。因此,当回调到达时,它会立即导致测试唤醒。然后我可以调用所有断言,包括异步任务存储的断言。

并且不要忘记对测试设置超时,以防止它们永远休眠:

@Test(timeout=10000)
public void mytest() {
    callAsyncTask();
    waitForAsyncTask();       // from base class
    assertAsyncTaskResult();  // from base class
}
Run Code Online (Sandbox Code Playgroud)