在我们的代码中,经常使用番石榴EventBus
上的消息。现在,在一些测试中,一些消息流量需要完成,然后在被测试者的状态断言之前(比如,在Thread.sleep(delay);
上安排了一些负载,并且这些需要完成,以便我们可以测试是否有事情正确加载)。
不幸的是,目前这是由可怕的AsyncEventBus
方法处理的;非常脆弱,使测试变得脆弱。
根据常见rb_ensure
上的操作完成情况,测试代码的正确方法是什么?
答案 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
这是测试时我的第一手方法。显然,如果要以易于测试的方式设计要测试的类,则更容易。
希望有帮助!