gpt4 book ai didi

java - 使用 JUnit 测试异步代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:10 25 4
gpt4 key购买 nike

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

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

我希望有:

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

感谢任何想法!

最佳答案

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

并且不要忘记在测试中设置超时以防止它们永远 hibernate :

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

关于java - 使用 JUnit 测试异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com