webentwicklung-frage-antwort-db.com.de

EasyMock: Void Methods

Ich habe eine Methode, die ungültig in einer Klasse zurückgibt, die eine Abhängigkeit von der Klasse ist, die ich testen möchte.

Diese Klasse ist riesig und ich verwende nur diese eine Methode. Ich muss die Implementierung dieser Methode für den Test ersetzen, da ich möchte, dass sie etwas anderes ausführt, und ich muss in der Lage sein, auf die Parameter zuzugreifen, die diese Methode empfängt.

Ich kann keinen Weg finden, dies in EasyMock zu tun. Ich glaube, ich weiß, wie man es mit Mockito macht, indem man doAnswer verwendet, aber ich möchte keine weitere Bibliothek hinzufügen, es sei denn, dies ist absolut notwendig.

68
Iker Jimenez

Wenn ich verstehe, was Sie richtig machen wollen, sollten Sie in der Lage sein, andAnswer() zu verwenden:

mockObject.someMethod(eq(param1), eq(param2));
expectLastCall().andAnswer(new IAnswer() {
    public Object answer() {
        //supply your mock implementation here...
        SomeClass arg1 = (SomeClass) getCurrentArguments()[0];
        AnotherClass arg2 = (AnotherClass) getCurrentArguments()[1];
        arg1.doSomething(blah);
        //return the value to be returned by the method (null for void)
        return null;
    }
});

Das EasyMock Benutzerhandbuch erklärt:

Rückgabewerte oder Ausnahmen anlegen

Manchmal möchten wir, dass unser Mock-Objekt einen Wert zurückgibt oder eine Ausnahme auslöst, die zum Zeitpunkt des tatsächlichen Aufrufs erstellt wird. Seit EasyMock 2.2 liefert das von expectLastCall() und expect(T value) zurückgegebene Objekt die Methode andAnswer(IAnswer answer) mit dessen Hilfe [Sie] eine Implementierung der Schnittstelle angeben können IAnswer , mit der der Rückgabewert oder die Ausnahmebedingung erstellt wird.

Innerhalb eines IAnswer Rückrufs sind die an den Scheinaufruf übergebenen Argumente über EasyMock.getCurrentArguments() verfügbar. Wenn Sie diese verwenden, können Refactorings wie das Umordnen von Parametern Ihre Tests beeinträchtigen. Du wurdest gewarnt.

91
matt b

Wenn Sie die void-Methode nur für jedes Mal aufrufen, wenn Sie erwarten, dass sie aufgerufen wird, und dann EasyMock.expectLastCall() aufrufen, bevor Sie replay() aufrufen, merkt sich Easymock jeden Aufruf.

Daher glaube ich nicht, dass Sie expect() (außer lastCall) explizit aufrufen müssen, da Sie von einer void-Methode nichts erwarten, außer dem Aufruf.

Danke Chris!

“Fun With EasyMock” von einem anderen StackOverflow-Benutzer Burt Beckwith ist ein guter Blog-Beitrag, der mehr Details bietet. Bemerkenswerter Auszug:

Grundsätzlich ist der Fluss, den ich benutze,:

  1. Erstellen Sie einen Schein
  2. rufen Sie expect(mock.[method call]).andReturn([result]) für jeden erwarteten Aufruf auf
  3. rufe mock.[method call] und dann EasyMock.expectLastCall() für jeden erwarteten ungültigen Aufruf auf
  4. rufen Sie replay(mock) auf, um vom Aufnahmemodus in den Wiedergabemodus zu wechseln
  5. spritze den Schein nach Bedarf
  6. rufen Sie die Testmethode auf
  7. rufen Sie verify(mock) auf, um sicherzustellen, dass alle erwarteten Aufrufe aufgetreten sind
22

Wenn Sie später nur auf die Parameter zugreifen möchten, können Sie auch die Captures -Klasse zu schätzen wissen, die in EasyMock 2.4 neu ist.

Sie können anstelle eines Matchers eine Instanz der Klasse "Capture" verwenden. Wenn Ihre verspottete Methode aufgerufen wird, speichert die Capture-Instanz den Parameter, mit dem sie aufgerufen wurde.

Capture<ChartPanel> captured = new Capture<ChartPanel>();
// setChartPanel is going to be called during execution;
// we want to verify some things about the ChartPanel
// instance it's invoked with
chartMock.setChartPanel(capture(captured));
replay(chartMock);

ufdm.setChartAnnotater(chartMock);
// afterPropertiesSet triggers the setChartPanel call...
ufdm.afterPropertiesSet();
verify(chartMock);

// verify some things about the ChartPanel parameter our
// mock object was invoked with
assertSame(plot, captured.getValue().getChart().getPlot());
5
piepera

Vielleicht möchten Sie PowerMock ausprobieren. EasyMock basiert auf der Proxy-Reflection-API, was bedeutet, dass alles ein Proxy ist und Sie nur Schnittstellen und somit nur nicht endgültige Methoden und Klassen testen können. Dies könnte für einige funktionieren, aber wenn Sie die Welt wie gebaut testen, benötigen Sie mehr Leistung.

Mit PowerMock beseitigt die Instrumentierungs-API Java 5) die Einschränkungen. Es ist nicht erforderlich, Scheinobjektimplementierungen des zu testenden Objekts zu schreiben (nur hässliche IMO). Verbinden Sie PowerMock mit Mockito (oder JMockit) und Ihnen. Ich werde wirklich zu den Rennen gehen.

Natürlich gibt es auch eine andere Möglichkeit, den Code neu zu schreiben, damit er einfacher getestet werden kann. Dies ist im Allgemeinen auch eine gute Idee, wenn möglich.

1
Joseph Lust