2012-09-22 12 views
5

Hay un concepto bastante genial de Ticker en guayaba. Desafortunadamente, parece que fue diseñado para generar cronómetros centrados en nano segundos para medir la duración de la ejecución.Objeto proxy para obtener el tiempo del sistema

Me gustaría encontrar algo para usar de esta manera, ya que hace más fáciles las clases de prueba sensibles a los cambios de hora. Me he encontrado con un problema históricamente cuando usé System.currentTimeMillis() porque es difícil simular el paso del tiempo en una prueba. Estaba pensando en usar una interfaz similar a la que tiene Guava, pero midiendo los tiempos en milis, ya que coincide con la mayoría de las bibliotecas disponibles.

Quería preguntar si alguien ha visto algo similar o tiene otras sugerencias antes de escribirlo yo mismo.

+2

Espera. ¿Desea un 'Ticker', excepto medir los tiempos en milisegundos? ¿Hay alguna razón especial por la que la conversión de nanosegundos es un problema? –

+2

@NickCampion: No es una mala pregunta. Ver mi respuesta – ColinD

Respuesta

4

Eso es lo que yo uso en mis proyectos:

public interface Clock { 
    LocalDate today(); 
    LocalTime time(); 
    LocalDateTime now(); 
    long timestamp(); 
} 

como lo hizo hace mucho más simple prueba de la unidad (o incluso posible). Tengo una implementación que siempre devuelve el tiempo real y un FakeClock que puedo controlar. Las implementaciones son tan sencillas que puede hacerlas fácilmente, no creo que haya algo parecido en Guava.

Este enfoque también se describe y recomienda en Growing Object-Oriented Software, Guided by Tests.

+0

Gracias por la idea y por la referencia del libro, parece interesante. –

0

Editar: Después de más reflexión, me gusta la sugerencia de Christoph y Colin. La idea de una funcionalidad similar para el reloj de pared sería agradable.

Como se señaló, la mejor estrategia aquí probablemente sea simplemente implementar un método que leerá un tiempo de milisegundos fuera del Ticker.

5

Como usted señala, es Ticker para medir transcurrido el tiempo (lo que es para System.nanoTime()), no pared del tiempo del reloj (lo que es para System.currentTimeMillis()) y no se debe utilizar para conseguir eso.

Sugiero crear una clase abstracta Clock que sea como Ticker pero para obtener el tiempo del reloj de pared en milis.

+0

Gracias por los comentarios Colin. Voy a marcarle a Christoph la 'respuesta' a pesar de que ustedes dicen lo mismo porque terminé usando el reloj exacto que él definió. Si pudiera marcar 2 respuestas, sería # 2 :) Desafortunadamente, también decidí usar joda-time, así que mi reloj no tendría sentido para volver a comprometerse con la guayaba. Eso es un fastidio. –

Cuestiones relacionadas