如何单元测试事件发射?

时间:2016-04-05 13:16:52

标签: java unit-testing

假设我有一个对象,应该在某些操作上触发一些事件?

我该如何测试?

我可以添加监听器,但监听器的代码将与测试分开。

final ArrayList<MyEvent> eventsFired = new ArrayList<>();
myObject.addMyEventListener(new MyEventListener() {
   public void myEventHappened(MyEvent evt) {
      eventsFired.add(evt);
   }
});
result = myObject.runOperation();
assert(result, ...);
assert(eventsFired.size(), ...); // is by one grater than before operation
assert(eventsFired.get(eventdFired.size()-1_, ...) // is correct

如何将它们放在一个地方?

更新

我能写这样的东西:

assertThat( myObject.runOperation() ).fires( ... )

或类似

Events events = captureEvents( object.runOperation() );
assertThat( events...)

2 个答案:

答案 0 :(得分:0)

您的测试看起来没问题,您基本上正在构建一个间谍对象,它将帮助您执行所需的断言。

如果使用专用测试工具真的感觉更好,Mockito.spy也会做这类事情;)

答案 1 :(得分:0)

我认为您可以使用JMockit和Expectations之类的东西来实现这一目标。我不确定会有多短,但我认为阅读和写作会更好。我自己对JMockit做的并不多,所以我不能举一个例子。