2011-01-02 9 views
0

Ich habe Schwierigkeiten beim Schreiben Unit Testfall für einige große Code-Basis, wo ich viele Klassen verspotten muss, so dass ich mit dem fortfahren kann leicht zu testen. Ich fand in der API-Dokumentation von JMock, dass die customeconstraint ich eine Methode verwenden kannWie schreibe ich benutzerdefinierte Constraint mit Jmock, wenn die Methode zu spotten ist mehrere Argumente haben

eval(Object argo) 

ist enthalten, die wahr zurück, wenn das Argument, die Erwartungen erfüllt.

Aber meine Methode wird mit mehreren Argumenten aufgerufen. Wie kann ich die Argumente auswerten und sicherstellen, dass die Argumente, mit denen die Methode aufgerufen wurde, korrekt sind? Danke im Voraus.

Antwort

3

Oft genügt es, Objekte zu erstellen, die zu den erwarteten Parameterwerten gleich sind:

context.checking(new Expectations() {{ 
    allowing(calculator).add(1, 2); 
    will(returnValue(3)); 

    DateTime loadTime = new DateTime(12); 
    DateTime fetchTime = new DateTime(14); 
    allowing(reloadPolicy).shouldReload(loadTime, fetchTime); 
    will(returnValue(false)); 
}}); 

JMock auch einige vordefinierte Einschränkungen bietet:

context.checking(new Expectations() {{ 
    allowing(calculator).sqrt(with(lessThan(0)); 
    will(throwException(new IllegalArgumentException()); 
}}); 

Sie können auch einen benutzerdefinierten Matcher verwenden with mit :

context.checking(new Expectations() {{ 
    DateTime loadTime = new DateTime(12); 
    allowing(reloadPolicy).shouldReload(with(equal(loadTime)), with(timeGreaterThan(loadTime)); 
    will(returnValue(false)); 
}}); 

Hier timeGreaterThan werden könnte wie folgt definiert:

public class TimeGreaterThanMatcher extends TypeSafeMatcher<DateTime> { 
    private DateTime minTime; 

    public TimeGreaterThanMatcher(DateTime minTime) { 
     this.minTime = minTime; 
    } 

    public boolean matchesSafely(DateTime d) { 
     return d != null && minTime.isBefore(d); 
    } 

    public StringBuffer describeTo(Description description) { 
     return description.appendText("a DateTime greater than ").appendValue(minTime); 
    } 

    public static Matcher<DateTime> timeGreaterThan(DateTime minTime) { 
     return new TimeGreaterThanMatcher(minTime); 
    } 
} 

die JMock Cookbook Für weitere Informationen siehe