2016-04-05 9 views
0

Angenommen, ich habe ein Objekt, das bei einer Operation ein Ereignis auslösen sollte?Wie testet man die Ereignisauslösung?

Wie würde ich es testen?

Ich kann Hörer hinzufügen, aber der Code des Hörers wird vom Testen getrennt.

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 

Wie bekomme ich sie an einem Ort?

UPDATE

Kann ich so etwas schreiben:

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

oder so etwas wie

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

Was meinen Sie mit "getrennt vom Testen" und "um sie an einem Ort zu bekommen"? – Vampire

+0

Diese Lösung schlägt vor, ein Scheinereignis zu verwenden: [link] (http://stackoverflow.com/questions/20977403/unit-testing-event-listeners) – RobP

+0

@RobP, soweit ich verstanden habe, will er das nicht testen (a) Ereignis-Listener, aber der Ereignisproduzent. Daher sieht der Beispielcode für mich gut aus, wenn ich Standard-Assertions verwenden möchte. – Vampire

Antwort

0

Ihr Test sieht ok, Sie im Grunde ein Spion-Objekt erstellen, die helfen Sie führen die Behauptung durch, die Sie brauchen.

Wenn Sie wirklich ein spezielles Testwerkzeug fühlen sich besser mit, tut Mockito.spy diese Art von Dingen zu;)

0

Ich glaube, Sie so etwas wie JMockit mit seinen Erwartungen, dies zu erreichen nutzen können. Ich bin mir nicht sicher, wie kurz es sein wird, aber es wird schöner sein zu lesen und zu schreiben, denke ich. Ich habe noch nicht viel mit JMockit gemacht, also kann ich kein Beispiel geben.