2009-08-02 9 views
6

Gibt es eine Möglichkeit, die aktuelle Zeit in einem jUnit 4.5 Test zu manipulieren? Ich habe die folgende Methode, die Ich mag würde füraktuelle Zeit im Komponententest manipulieren?

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

Eine Möglichkeit, eine Unit-Test haben, um es einfacher zu machen, testen Sie es in zwei Verfahren

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    return getLastWeekFor(c); 
} 

public String getLastWeekFor(GregorianCalander c) { 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

aufzuspalten, die mir die testen können Wochen-Subtraktionslogik, aber lässt getLastWeek nicht getestet und ich bevorzuge nur eine Methode dafür.

+0

Eigentlich ist es nur eine Methode, nur mit zwei verschiedenen Parameterlisten :) – guerda

Antwort

6

Sie haben keine echte Möglichkeit, die Systemzeit zu manipulieren.

Tatsächlich haben Sie die Methode ziemlich gut umstrukturiert, um sie testbar zu machen. Ich würde es dabei belassen.

3

Ich kann hier zwei Wege sehen.

Entweder erstellen Sie eine DateUtils Factory-Klasse, die den Bau von Calendar und Date Instanzen kapselt. Dann können Sie dies gegen eine kontrollierbare Fabrik tauschen. Das heißt, Sie haben eine zweite Implementierung von DateUtils, die ebenfalls eine setCurrentTime-Methode verfügbar macht, und geben dann explizit Calendar Instanzen zurück, die auf dieses Datum gesetzt sind.

Oder Sie können JMockit verwenden, um Ihren Anruf von new GregorianCalendar "neu zu definieren", stattdessen wird eine Scheininstanz zurückgegeben. Ich habe das selbst nicht gemacht, aber es gibt eine Beschreibung here.

Ihre Option, die Methode in zwei Methoden zu brechen, ist auch eine vollkommen gültige Option. Ich denke, dass es das ist, was die meisten Leute tun - einschließlich mir selbst: aber die Wahrheit ist, dass es deinem Design schadet, besonders wenn die Klasse anderem Code ausgesetzt ist.

+0

Die ersten beiden Vorschläge, obwohl sie perfekt sind und sogar in anderen Situationen stark verwendet werden, fühlen sich ein wenig übertrieben für die Bedürfnisse von OP. –

1

Sieht so aus, als ob Sie versuchen, das wiederzugeben, was JODA Zeit tut. Ich werde es erwähnen, falls Sie es nicht wissen. Sie können den Trade-Off zwischen dem Rad neu erfinden und eine Abhängigkeit hinzufügen.

+0

Actully Ich fand JODA früher heute und erkannte, dass das war, was ich eigentlich verwenden wollte. Wie würde eine testbare JODA-Version aussehen? Oder sollte ich einfach davon ausgehen, dass JODA korrekt funktioniert, da es eigene Tests haben sollte? –

+0

Überprüfen Sie die JODA-Quelle und überprüfen Sie, ob das Gerät getestet wurde. Ich wette, dass es so ist. Normalerweise gehe ich davon aus, dass eine Drittanbieter-Bibliothek getestet wird, bis sie mir einen Grund gibt, etwas anderes zu glauben. Im schlimmsten Fall haben sie eine größere Benutzerbasis als Sie. Viele Leute, die auf Code hauen, sind eine gute Möglichkeit, viele Fehler zu finden und zu beheben. – duffymo

Verwandte Themen