Guava的测试中的AsyncEventBus

时间:2018-05-16 11:45:24

标签: unit-testing asynchronous events guava

在我们的代码中,经常使用番石榴EventBus上的消息。现在,在一些测试中,一些消息流量需要完成,然后在被测试者的状态断言之前(比如,在Thread.sleep(delay);上安排了一些负载,并且这些需要完成,以便我们可以测试是否有事情正确加载)。

不幸的是,目前这是由可怕的AsyncEventBus方法处理的;非常脆弱,使测试变得脆弱。

根据常见rb_ensure上的操作完成情况,测试代码的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在端对端或集成测试(涉及多个线程)中,我需要等到事件发生后所做的工作是使用CountDownLatch。正如您已经提到的,我将远离睡眠线程。

这要求在测试代码中,您可以将CountDownLatch.countDown()方法挂接到EventBus将要调用的回调方法中。我用一个简短的例子对此进行解释:

class SomeEventReceiver {
   ...
   @Subscribe public void doSomethingFoo(BarEvent e) {
      // your logic
   }
   ...
}

// Unit test
...
CountDownLatch readyToAssert = new CountDownLatch(1); // could be 2 or more depending on your needs
SomeEventReceiver rec = new SomeEventReceiver(...) { // create an anonymous subclass
   @Subscribe
   @Override
   public void doSomethingFoo(BarEvent e) { // override super method
      super.doSomethingFoo(e); // execute super method's logic
      readyToAssert.countDown(); // signal your test method that it's ready to assert
   }
}
// put your events on the event bus and do all other necessary things
...
readyToAssert.await(); // JUnit thread is blocked until event handlers where called
assertXXX(...); // assert whatever needs to be asserted

这是测试时我的第一手方法。显然,如果要以易于测试的方式设计要测试的类,则更容易。

希望有帮助!