können Sie ein @Rule
für diesen. Hier ist der Code für die Regel:
import org.joda.time.DateTimeZone;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class UTCRule extends TestWatcher {
private DateTimeZone origDefault = DateTimeZone.getDefault();
@Override
protected void starting(Description description) {
DateTimeZone.setDefault(DateTimeZone.UTC);
}
@Override
protected void finished(Description description) {
DateTimeZone.setDefault(origDefault);
}
}
Sie die Regel wie diese verwenden:
public class SomeTest {
@Rule
public UTCRule utcRule = new UTCRule();
....
}
Dadurch wird die aktuelle Zeitzone UTC vor jedem Test in SomeTest
ausgeführt wird ändern und es wird Stellen Sie die Standardzeitzone nach jedem Test wieder her.
Wenn Sie mehrere Zeitzonen zu überprüfen, verwenden Sie eine Regel wie diese:
import org.joda.time.DateTimeZone;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class TZRule extends TestWatcher {
private DateTimeZone origDefault = DateTimeZone.getDefault();
private DateTimeZone tz;
public TZRule(DateTimeZone tz) {
this.tz = tz;
}
@Override
protected void starting(Description description) {
DateTimeZone.setDefault(tz);
}
@Override
protected void finished(Description description) {
DateTimeZone.setDefault(origDefault);
}
}
Legen Sie alle betroffenen Tests in einer abstrakten Basisklasse AbstractTZTest
und erweitern sie:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.UTC);
}
That führt alle Tests in AbstractTZTest
mit UTC aus. Für jede Zeitzone, die Sie testen möchten, müssen Sie eine andere Klasse benötigen:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.forID("...");
}
Da Testfälle vererbt werden, das ist alles - Sie müssen nur die Regel definieren.
In ähnlicher Weise können Sie die Systemuhr verschieben. Verwenden Sie eine Regel, die DateTimeUtils.setCurrentMillisProvider(...)
aufruft, um zu simulieren, dass der Test zu einer bestimmten Zeit ausgeführt wird, und DateTimeUtils.setCurrentMillisSystem()
, um die Standardeinstellungen wiederherzustellen.
Hinweis: Ihr Provider muss eine Möglichkeit haben, die Uhr ankreuzen zu lassen oder alle neuen DateTime
Instanzen haben denselben Wert. Ich erweitere den Wert oft um eine Millisekunde jedes Mal, wenn getMillis()
aufgerufen wird.
Hinweis 2: Das funktioniert nur mit joda-Zeit. Es hat keinen Einfluss auf new java.util.Date()
.
mögliche Duplikate von [Einheitentests mit Daten werden in allen Zeitzonen und mit/ohne Sommerzeit durchgeführt] (http://stackoverflow.com/questions/10833948/make-unit-tests-with-dates-pass-in- all-time-zones-and-with-out-dst) – Caleb
Es ist kein Duplikat; Es ist ein Follow-up. –