Java 用JUnit测试异步代码

Java 用JUnit测试异步代码,java,multithreading,testing,junit,Java,Multithreading,Testing,Junit,我想测试一些依赖网络传输的代码。代码发出请求并提供回调-当请求完成时,将触发回调。我想模拟网络传输,并使用Thread.sleep模拟一些延迟。。。但这当然会让整个测试暂停 到目前为止,我一直在创建新线程,并在整个测试过程中使用CountDownLatches来阻止测试在启动回调之前结束。我的模拟网络对象创建一个新线程,在该线程上休眠,然后启动回调。这实际上工作得很好,但问题是回调中的任何断言错误都不会报告给原始junit线程——相反,我在控制台上得到异常文本,在控制台上更难理解和使用 我希望有

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

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

我希望有以下两种情况:

  • 将生成的线程的
    assertEquals
    输出通过管道传输到主JUnit输出收集器的方法,或
  • 在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: