Java 用JUnit测试异步代码
我想测试一些依赖网络传输的代码。代码发出请求并提供回调-当请求完成时,将触发回调。我想模拟网络传输,并使用Java 用JUnit测试异步代码,java,multithreading,testing,junit,Java,Multithreading,Testing,Junit,我想测试一些依赖网络传输的代码。代码发出请求并提供回调-当请求完成时,将触发回调。我想模拟网络传输,并使用Thread.sleep模拟一些延迟。。。但这当然会让整个测试暂停 到目前为止,我一直在创建新线程,并在整个测试过程中使用CountDownLatches来阻止测试在启动回调之前结束。我的模拟网络对象创建一个新线程,在该线程上休眠,然后启动回调。这实际上工作得很好,但问题是回调中的任何断言错误都不会报告给原始junit线程——相反,我在控制台上得到异常文本,在控制台上更难理解和使用 我希望有
Thread.sleep
模拟一些延迟。。。但这当然会让整个测试暂停
到目前为止,我一直在创建新线程,并在整个测试过程中使用CountDownLatch
es来阻止测试在启动回调之前结束。我的模拟网络对象创建一个新线程,在该线程上休眠,然后启动回调。这实际上工作得很好,但问题是回调中的任何断言错误都不会报告给原始junit线程——相反,我在控制台上得到异常文本,在控制台上更难理解和使用
我希望有以下两种情况:
assertEquals
输出通过管道传输到主JUnit输出收集器的方法,或谢谢你的建议 当我必须实现类似于您的异步机制时,我创建了一个抽象类
AsyncTestCase
,它保存测试错误并提供特殊方法waitForCallback()
。当异步任务在预期结果中发现错误时,它会将错误放入此变量中。setter对waitForCallback()
使用的对象调用notify()
。所以,当回调到达时,它会立即导致测试唤醒。然后我可以调用所有断言,包括异步任务存储的断言
不要忘记在测试中设置超时,以防止它们永远沉睡:
@Test(timeout=10000)
public void mytest() {
callAsyncTask();
waitForAsyncTask(); // from base class
assertAsyncTaskResult(); // from base class
}
你所描述的是。下面是一个例子:
final Waiter waiter = new Waiter();
new Thread(() -> {
doSomeWork();
waiter.assertTrue(true);
waiter.resume();
}).start();
// Wait for resume() to be called
waiter.await(1000);
为什么不看看QUnit: