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

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

我希望有:

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

感谢您的任何想法!

===============>>#1 票数:4 已采纳

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

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

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

===============>>#2 票数:1

您要描述的是ConcurrentUnit 这是一个例子:

  final Waiter waiter = new Waiter();

  new Thread(() -> {
    doSomeWork();
    waiter.assertTrue(true);
    waiter.resume();
  }).start();

  // Wait for resume() to be called
  waiter.await(1000);

  ask by Riley Lark translate from so

未解决问题?本站智能推荐: