Das mag wie eine ziemlich detaillierte Frage über Easymock erscheinen, aber es fällt mir schwer, eine Support-Site/Forum/Mailing-Liste für diese Bibliothek zu finden.Easymock: Ist die Reihenfolge der Eroberungen wichtig?
Ich stoße auf einen Fehler, wenn ich die Methode captures()
verwende, die die erfassten Parameter scheinbar außer Betrieb setzt.
Hier ist eine vereinfachte Version von dem, was ich testen:
public class CaptureTest extends TestCase {
// interface we will be mocking
interface Processor {
void process(String x);
}
// class that uses the interface above which will receive the mock
class Component {
private Processor processor;
private String[] s = { "one", "two", "three", "four" };
Component(Processor processor) {
this.processor = processor;
}
public void doSomething() {
for (int i = 0; i < s.length; i++) {
processor.process(s[i]);
}
}
}
public void testCapture() {
//create the mock, wire it up
Processor mockProcessor = createMock(Processor.class);
Component component = new Component(mockProcessor);
//we're going to call the process method four times
//with different arguments, and we want to capture
//the value passed to the mock so we can assert against it later
Capture<String> cap1 = new Capture<String>();
Capture<String> cap2 = new Capture<String>();
Capture<String> cap3 = new Capture<String>();
Capture<String> cap4 = new Capture<String>();
mockProcessor.process(and(isA(String.class), capture(cap1)));
mockProcessor.process(and(isA(String.class), capture(cap2)));
mockProcessor.process(and(isA(String.class), capture(cap3)));
mockProcessor.process(and(isA(String.class), capture(cap4)));
replay(mockProcessor);
component.doSomething();
//check what values were passed to the mock
assertEquals("one", cap1.getValue());
assertEquals("two", cap2.getValue());
assertEquals("three", cap3.getValue());
assertEquals("four", cap4.getValue());
verify(mockProcessor);
}
}
(Bitte beachten Sie, dass dies nur ein vereinfachtes Testfall ist - ich weiß, dass ich den genauen Wert der Argumente angeben konnte ich meinen geben erwarten Spott, aber in meinem realen Fall sind die Argumente komplexe Objekte mit einer Handvoll von Feldern, und ich möchte das Objekt erfassen, so dass ich gegen nur einige dieser Felder behaupten kann, ohne das gesamte Objekt in meinem Testfall neu zu erstellen.
Wenn ich den Test ausführen, scheitert es an:
junit.framework.ComparisonFailure: erwartet: < [one]> aber war: < [vier]>
Was bedeutet, dass die Parameter, den EasyMock in cap1
erfasst, ist nicht der erste Aufruf der Methode, sondern der letzte (da der Wert four
ist). Ich bekomme die gleichen Ergebnisse, wenn ich die captures()
Deklarationen umkehren, dh cap4
mit dem ersten Methodenaufruf usw.
Dies scheint wie ein Fehler in EasyMock - verschiedene Parameter an die gleiche Methode in verschiedenen Aufrufen don 'don' t scheint korrekt zu erfassen.
Verwendet jemand sonst capture()
mit EasyMock und ähnliche Probleme? Gibt es eine einfache Problemumgehung, die Sie kennen, oder eine andere Art, wie ich die Parameter erfassen kann, die an die Methoden meines Mocks übergeben werden?
Update 1: feste Codebeispiel zu zeigen, dass ich createMock
verwende, nicht createStrictMock
, aber ich habe den gleichen Fehler mit beiden (obwohl der tatsächliche Wert dessen, was Änderungen erfasst wird).
Ich habe dieses Problem untersucht und es ist ziemlich verwirrend. Wenn Sie für jedes Capture eine System.out.println-Anweisung ausführen, sehen Sie Folgendes mit einem createMock: vier, vier, vier, vier. Mit einem createStrickMock: zwei, zwei, drei, vier. – hooknc
Das hört sich definitiv danach an! Ich habe einen Fehler auf Easymocks sourceforge-Seite geschickt, hoffentlich wird jemand antworten - obwohl aus dem Mangel an Mailinglisten, Foren/Kommentaren auf der Homepage, etc. habe ich das Gefühl, dass Unterstützung extrem begrenzt ist :( –