Puede utilizar un @Rule
para esto. Aquí está el código para la regla:
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);
}
}
Puede utilizar la regla como la siguiente:
public class SomeTest {
@Rule
public UTCRule utcRule = new UTCRule();
....
}
Esto va a cambiar la zona horaria actual a UTC antes de cada prueba en SomeTest
será ejecutado y lo hará restaurar la zona horaria predeterminada después de cada prueba.
Si desea comprobar varias zonas horarias, utilizar una regla como ésta:
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);
}
}
Poner todas las pruebas afectadas en una clase base abstracta AbstractTZTest
y extenderla:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.UTC);
}
Eso ejecutará todas las pruebas en AbstractTZTest
con UTC. Para cada zona horaria que desea probar, necesitará otra clase:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule(DateTimeZone.forID("...");
}
Dado que se heredan los casos de prueba, eso es todo - sólo tiene que definir la regla.
De forma similar, puede cambiar el reloj del sistema. Use una regla que llame al DateTimeUtils.setCurrentMillisProvider(...)
para simular que la prueba se ejecuta en un momento determinado y DateTimeUtils.setCurrentMillisSystem()
para restablecer los valores predeterminados.
Nota: Su proveedor necesitará una forma de hacer que el reloj marque o todas las instancias nuevas de DateTime
tendrán el mismo valor. A menudo adelanto el valor en un milisegundo cada vez que se llama getMillis()
.
Nota 2: Eso solo funciona con joda-time. No afecta a new java.util.Date()
.
posible duplicado de [Hacer pruebas unitarias con fechas que pasan en todas las zonas horarias y con/sin DST] (http://stackoverflow.com/questions/10833948/make-unit-tests-with-dates-pass-in- all-time-zones-and-with-out-dst) – Caleb
No es un duplicado; es un seguimiento. –