2011-12-11 127 views
8

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

到目前为止,我已经作出新的线程,使用整个测试CountDownLatch ES从回调发射结束之前停止测试。我的模拟网络对象创建一个新线程,睡在该线程上,然后触发回调。这实际上工作得很好,但问题在于,回调中的任何断言错误都不会报告给原始junit线程 - 相反,我在控制台上收到异常文本,在这些文本中,理解和使用它们更加困难。

我希望有两种:

  1. 一种方法来管,从产生的线程assertEquals输出到主JUnit的输出收藏家,或
  2. 一个完全不同的,更好的方式来测试的JUnit线程代码,或
  3. 一些方法来模拟异步代码在一个单独的线程

感谢您的想法!

+0

为什么查不出来QUnit:http://docs.jquery.com/QUnit –

回答

4

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

而且不要忘了把超时你的测试,以防止他们睡觉永远:

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

啊,聪明的想法。谢谢! –

0

你描述什么是ConcurrentUnit。这里有一个例子:

final Waiter waiter = new Waiter(); 

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

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