2010-09-14 4 views

Antwort

0

gelang es mir, mit einer Lösung zu kommen:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}); 
+0

Für mich funktioniert es nicht. Es sagt "erwartet: 1, aktuell: 0". – Vic

+1

Vereinbart, dass dies nicht funktioniert. Die richtige Antwort stammt von David Nguyen. – dhaag23

1

Sieht aus wie ein Fehler für mich. Die interne Klasse Range erlaubt es nicht, ein Maximum von weniger als 1 einzustellen.

Konnten Sie diese Methode nicht vortäuschen, und rufen Sie einfach Assert.fail()?

+0

Ja, ich habe es so gemacht, siehe meine Antwort – nkr1pt

1

Wenn Sie Ihre Methode nicht erwartet, dann ist es ja nicht nur aufgerufen werden. Aber ich stimme zu, dass es nicht mit einem schönen Schein funktioniert.

8

mit EasyMock 3.0, benötigen Sie eine .anyTimes() auf dem expectLastCall oder den Test hinzufügen fehl:

Expectation failure on verify: myMethod(): expected: 1, actual: 0` 

basierend auf nkr1pt Beispiel:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}).anyTimes(); 
+3

Ich denke: Assert.assertFail(); sollte nur sein: Assert.fail(); – Matt

+1

Während dies eine funktionierende Antwort ist, mag ich die von David Wallace besser, da es weniger wortreich ist. – qben

7

Die Tatsache, dass einige Verfahren nicht aufgerufen wird, wird von Mock oder StrictMock gesteuert. Sie werden eine Ausnahme auslösen, wenn diese nicht aufgezeichnete Methode aufgerufen wird. Dieses Problem tritt nur bei Verwendung von NiceMock s auf, wo Standardwerte zurückgegeben werden, wenn nicht aufgezeichnete Methoden aufgerufen werden.

So eine Lösung kann nicht NiceMock s sein.

+2

Ich stimme der Schlussfolgerung nicht zu. Vielleicht ist in diesem Fall ein schöner Schein nicht die beste Wahl. Aber wenn Sie sicherstellen wollen, dass eine Methode nicht aufgerufen wird, ist dies in der Tat das Einzige, was Sie testen möchten. Es ist besser, dies mit einer verspotteten Methode zu betonen, die mit einer entsprechenden Nachricht fehlschlägt. – qben

+1

Es ist ein gutes Argument. Ich wollte auf dieses hinweisen, da ich darauf gestoßen bin, warum ich 'mal (0) 'nicht angeben kann. Und erst später wurde mir klar, dass dies der Idee des netten Spottes widerspricht, und nicht nette Spottdrohungen erlauben, dass nicht aufgezeichnete Methoden nicht ausgeführt werden. Eine assert-Ausnahme als Antwort zu werfen, schien eher eine Art Workaround für mich zu sein und 0 Methodenaufrufe sollten mit nicht-netten Mocks spezifiziert werden. Vielleicht bin ich ein bisschen selbstbewusst in der Schlussfolgerung. Ich werde es nur korrigieren. – Vic

16

Sie könnten .andThrow(new AssertionFailedError()).anyTimes(); verwenden - das ist die gleiche Ausnahme, die Assert.fail() wirft, ist aber weniger ausführlich als eine Answer.

+2

Vielleicht eine gute Beschreibung hinzufügen, warum der Test fehlgeschlagen ist, verbessert diese Lösung (die das Beste von allen hier IMO ist). – qben