2009-08-02 14 views
6

¿Hay alguna forma de manipular la hora actual en una prueba jUnit 4.5? Tengo el siguiente método que me gustaría tener una prueba de unidad demanipular la hora actual en pruebas unitarias?

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); 
} 

Una forma de hacerlo más fácil de probar es dividirlo en dos métodos

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); 
} 

que me permite probar el la lógica de resta de semana, pero deja getLastWeek sin probar y prefiero tener solo un método para esto.

+0

Acutally, es solo un método, solo con dos listas de parámetros diferentes :) – guerda

Respuesta

6

No tiene una manera real de manipular el tiempo del sistema.

En realidad, refactorizó el método bastante bien para que sea comprobable. Yo lo mantendría así.

3

Puedo ver dos caminos aquí.

O bien, cree una clase de fábrica DateUtils, que encapsula la construcción de las instancias Calendar y Date. Luego puede cambiar esto por una fábrica controlable. Es decir, tiene una segunda implementación de DateUtils que también expone un método setCurrentTime y, a continuación, devuelve explícitamente instancias Calendar establecidas en esa fecha.

O bien, puede utilizar JMockit para realmente "redefinir" su llamada de new GregorianCalendar por lo que en su lugar se devuelve una instancia simulada. No lo he hecho yo mismo, pero hay una descripción here.

Su opción, dividir el método en dos métodos, también es una opción perfectamente válida. Creo que es lo que hace la mayoría de la gente, incluido yo mismo, pero la verdad es que daña tu diseño, especialmente si la clase está expuesta a otro código.

+0

Las dos primeras sugerencias, aunque son perfectamente válidas e incluso muy utilizadas en otras situaciones, son un poco exageradas para las necesidades de OP. –

1

Parece que está intentando recrear lo que hace JODA Time. Lo citaré en caso de que no lo sepas. Puede hacer la compensación entre reinventar la rueda y agregar una dependencia.

+0

Actully Encontré JODA el día de hoy y me di cuenta de que era lo que realmente quería usar. ¿Cómo se vería una versión comprobable de JODA? ¿O debería simplemente asumir que JODA funciona correctamente ya que debería tener sus propias pruebas? –

+0

Compruebe la fuente JODA y vea si se ha probado la unidad. Apuesto a que sí. Por lo general, supongo que se prueba una biblioteca de terceros hasta que me da una razón para creer lo contrario. En el peor, tienen una base de usuarios más grande que tú. Mucha gente golpeando el código es una buena forma de encontrar y corregir muchos errores. – duffymo