2016-04-05 79 views
0

假設我有一個對象,應該在某些操作上觸發某個事件?如何以單元測試事件觸發?

我該如何測試它?

我可以添加偵聽器,但偵聽器的代碼將與測試分開。

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 

如何讓他們在一個地方?

UPDATE

我可以寫這樣的事:

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

或類似

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

你是什麼意思的「從測試中分離出來」和「讓他們在一個地方」? – Vampire

+0

此解決方案建議使用模擬事件:[link](http://stackoverflow.com/questions/20977403/unit-testing-event-listeners) – RobP

+0

@RobP就我所知他不想測試(a )事件監聽器,但是事件監聽器。因此,如果使用標準斷言是他的方式,示例代碼對我來說看起來很好。 – Vampire

回答

0

您的測試看起來不錯,你基本上是建立一個間諜的對象,這將有助於你執行你需要的斷言。

如果你真的感覺更好用專用測試工具,Mockito.spy做這樣的事情太多;)

0

我想你可以使用類似JMockit其預期實現這一目標。我不確定它會有多短,但我認爲閱讀和寫作會更好。我自己還沒有對JMockit做太多的工作,所以我不能舉一個例子。

相關問題