Ich habe eine Methode, die void 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 einzige Methode. Ich muss die Implementierung dieser Methode für den Test ersetzen, da ich möchte, dass sie etwas anderes macht, und ich muss in der Lage sein, auf die Parameter zuzugreifen, die diese Methode empfängt.
Ich kann in EasyMock keinen Weg finden, dies zu tun . Ich glaube, ich weiß, wie man es mit Mockito macht , doAnswer
aber ich möchte keine weitere Bibliothek hinzufügen, es sei denn, dies ist absolut notwendig.
Wenn Sie nur später auf die Parameter zugreifen möchten, können Sie auch die Captures- Klasse schätzen, die in EasyMock 2.4 neu ist.
Sie können eine Instanz der Klasse "Capture" anstelle eines Matchers 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());
quelle
Vielleicht möchten Sie PowerMock ausprobieren. EasyMock basiert auf der Proxy-Reflection-API, dh alles ist ein Proxy, und Sie können nur Schnittstellen und damit nur nicht endgültige Methoden und Klassen testen. Dies mag für einige funktionieren, aber wenn Sie die Welt als gebaut testen, benötigen Sie mehr Leistung.
Mit PowerMock beseitigt die Java 5-Instrumentierungs-API die Einschränkungen. Es ist nicht erforderlich, Scheinobjektimplementierungen des zu testenden Objekts zu schreiben (nur hässliche IMO). Wenn Sie PowerMock mit Mockito (oder JMockit) kombinieren, können Sie wirklich loslegen.
Natürlich gibt es die andere Richtung, Ihren Code neu zu schreiben, um ihn leichter testen zu können. Dies ist im Allgemeinen auch eine gute Idee, wenn möglich.
quelle
In solchen Situationen habe ich festgestellt, dass es am besten ist, eine verschachtelte Klasse in meiner Unit-Test-Klasse zu erstellen und die Methoden mit speziellen Anforderungen auf diese Weise zu überschreiben. Wenn Sie also testen,
ClassA
welche Methode diese Methode mit den Parametern enthält, auf die Sie zugreifen müssen, gehen Sie wie folgt vor:class MockClassA extends ClassA { @Override void specialMethod(String param1, String param2) { // do logging or manipulation of some sort super.specialMethod(param1,param2); // if you need to } }
In meinem Unit-Test-Code verwende ich stattdessen einfach diese Instanz. Behandle es einfach so, als wäre es ein anderes Scheinobjekt. Viel einfacher als das Mischen von Bibliotheken, was meiner Meinung nach wahrscheinlich keine gute Idee ist.
quelle