2010-11-15 8 views
19

Lassen Sie uns einen kurzen Ausschnitt des Testens Code übernehmen:Gibt es eine Möglichkeit, etwas wie jUnit Assert-Nachrichtenargument in Mockitos Verify-Methode zu haben?

Observable model = Class.forName(fullyQualifiedMethodName).newInstance(); 
Observer view = Mockito.mock(Observer.class); 
model.addObserver(view); 
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    Mockito.verify(
    view, Mockito.atLeastOnce() 
).update(Mockito.<Observable>any(), Mockito.<Object>any()); 
} 

Mockito.verify Methode löst eine Ausnahme, wenn ein Verfahren in einem Modell Observable.setChanged() Methode nicht aufgerufen hat.

Problem: ohne loggers/System.print.out hinzufügen Ich kann nicht erkennen, was ist die aktuelle Methode, die den Test nicht bestanden hat. Gibt es eine Möglichkeit, etwas ähnliches mit zu jUnit Assert Methoden:

Assert.assertEquals(
    String.format("instances %s, %s should be equal", inst1, inst2), 
    inst1.getParam(), 
    inst2.getParam() 
); 

LÖSUNG:

verify(observer, new VerificationMode() 
{ 
    @Override 
    public void verify(VerificationData data) 
    { 
    assertTrue(
     format(
      "method %s doesn't call Observable#setChanged() after changing the state of the model", 
      method.toString() 
     ), 
     data.getAllInvocations().size() > 0); 
    } 
}).update(Mockito.<Observable>any(), Mockito.<Object>any()); 

Antwort

17

Dies funktioniert der Trick (einfach und klar):

try { 
verify(myMockedObject, times(1)).doSomthing(); 
} catch (MockitoAssertionError e) { 
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage()); 
} 
+6

Die Ursache als zweites Argument zu übergeben ist normalerweise besser als die Verkettung der Nachricht. 'new MockitoAssertionError (" message ", e)' – Kapep

+1

MockitoAssertionError hat keinen Konstruktor mit den Parametern MockitoAssertionError (String, Exception) Ich benutze 'new AssertionError (" message ", exception)', da dies der Ausnahmetyp ist wird von JUnit für Assertions geworfen. –

3

Es gibt keine direkte API-Aufruf, der eine Meldung erlaubt auf verifizieren. Aber ich denke, wenn Sie Ihre Überprüfungssignatur ändern, um das Methodenobjekt anstelle von Mockito.any() zu verwenden, wird sich der toString() für die Method-Klasse einschalten und Ihnen geben, was Sie wollen.

So etwas wie das.

import static org.mockito.Matchers.anyObject; 
import static org.mockito.Mockito.atLeastOnce; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Matchers.eq; 

... 

Observable model = Class.forName("class name").newInstance(); 

verify(view, times(1)).update(eq(model), anyObject()); 

for (Method method : Class.forName("class name").getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    verify(view, atLeastOnce()).update(eq(method), anyObject()); 
} 
+0

Netter Versuch, aber es ist nicht zur Arbeit gehen. Die erste Methode des Observer # update (Object source, Object arg) ist das Modell, das die Änderung ausstrahlt, nicht die Methode, die ihren Status geändert hat. –

+0

Fügen Sie einfach die Erwartung hinzu, die Sie sehen möchten. Wenn das eine andere Art von Observablen beinhaltet, dann sei es so. –

+0

Sie müssen wahrscheinlich mehr Code hinzufügen, der Ihre Klassenstruktur besser erklärt. –

1

Sie können einen Matcher erstellen, um Informationen zur aktuellen Methode zu drucken. Es wird etwas klobig sein, aber es wird funktionieren, den Methodennamen auszudrucken, wenn die Verifizierung fehlschlägt.

6

Sie können nicht in Mockito tun. Die Mockito-Syntax macht das Testen des erwarteten Verhaltens sehr einfach, hat jedoch kein Teststatus-Konzept.

Was Sie versuchen, ist, einige Informationen zu haben, die nicht in dem verspotteten Objekt sind, wenn die Mocks die Erwartungen nicht erfüllen.

Wenn Sie wirklich tun wollen, sehe ich zwei allgemeine Wege: entweder Sie Ihre eigene verificationMode Implementierung der Schnittstelle schaffen

org.mockito.verification; 
public static interface VerificationMode 

und das Hinzufügen einer Methode, wie atLeastOnceMsd (String msg), der die Nachricht zeigen in Bei einem Fehler oder Hinzufügen der aktuell getesteten Methode im Modell zum View-Objekt

zum Beispiel mit einer ähnlichen Linie in der inneren Schleife.

view.setName("now we are testing " + method.getName());