È possibile utilizzare un @Rule
per questo. Ecco il codice per la regola:
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);
}
}
È possibile utilizzare la regola in questo modo:
public class SomeTest {
@Rule
public UTCRule utcRule = new UTCRule();
....
}
Questo cambierà il fuso orario corrente per UTC prima di ogni prova in SomeTest
verrà eseguito e si ripristinare il fuso orario predefinito dopo ogni test.
Se si desidera controllare diversi fusi orari, utilizzare una regola come questa:
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);
}
}
Mettere tutti i test interessate in una classe base astratta AbstractTZTest
ed estenderlo:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.UTC);
}
Quello eseguirà tutti i test in AbstractTZTest
con UTC. Per ogni fuso orario che si desidera verificare, avrete bisogno di un'altra classe:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.forID("...");
}
Poiché i casi di test vengono ereditati, questo è tutto - basta per definire la regola.
In modo simile, è possibile spostare l'orologio di sistema. Utilizzare una regola che chiami DateTimeUtils.setCurrentMillisProvider(...)
per simulare che il test venga eseguito in un determinato momento e DateTimeUtils.setCurrentMillisSystem()
per ripristinare i valori predefiniti.
Nota: il provider richiederà un modo per far sì che l'orologio torni o tutte le nuove istanze DateTime
abbiano lo stesso valore. Avanzando spesso il valore di un millisecondo ogni volta che viene chiamato getMillis()
.
Nota 2: funziona solo con joda-time. Non ha effetto su new java.util.Date()
.
possibile duplicato di [Effettua test unitari con date pass in tutti i fusi orari e con/out DST] (http://stackoverflow.com/questions/10833948/make-unit-tests-with-dates-pass-in- zone di tutti i tempi-e-con-out-dst) – Caleb
Non è un duplicato; è un seguito. –