2012-09-22 1 views
5

C'è un concetto piuttosto interessante di uno Ticker in Guava. Sfortunatamente, sembra che sia stato progettato attorno a generare cronometri focalizzati nano-secondi per misurare la durata dell'esecuzione.Oggetto proxy per ottenere il tempo di sistema

Mi piacerebbe trovare qualcosa da usare in questo modo, perché rende più facili le classi di test sensibili alle variazioni di orario. Ho riscontrato storicamente un problema quando ho utilizzato System.currentTimeMillis() perché è difficile simulare il passare del tempo in un test. Stavo pensando di usare un'interfaccia simile a ciò che Guava ha ma misurare i tempi in millis invece poiché corrisponde a più delle librerie disponibili.

Volevo chiedere se qualcuno ha visto qualcosa di simile o ha altri suggerimenti prima di andare a scrivere da solo.

+2

Attendere. Vuoi un 'Ticker', eccetto misurare i tempi in millisecondi? C'è qualche ragione particolare per cui la conversione da nanosecondi è un problema? –

+2

@NickCampion: non è una cattiva domanda. Vedi la mia risposta. – ColinD

risposta

4

Questo è quello che uso nei miei progetti:

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

come ha detto lei che rende il test delle unità molto più semplice (o anche possibile). Ho un'implementazione che restituisce sempre il tempo reale e un FakeClock che posso controllare. Le sue implementazioni sono così semplici che puoi facilmente farle da te - non penso ci sia qualcosa di simile in Guava.

Questo approccio è anche descritto e consigliato in Growing Object-Oriented Software, Guided by Tests.

+0

Grazie per l'idea e per il riferimento del libro, guarda interessante. –

0

Modifica: Dopo aver riflettuto ulteriormente, mi piace il suggerimento di Christoph e Colin. L'idea di una funzionalità simile per l'orologio da parete sarebbe bella.

Come sottolineato, la migliore strategia qui è probabilmente solo per implementare un metodo che leggerà un millesimo di secondo dal Ticker.

5

Come fai notare, Ticker è per la misurazione trascorsi tempo (cosa System.nanoTime() è per), non parete di tempo di orologio (cosa System.currentTimeMillis() è per) e non si dovrebbe usare per ottenere questo.

Suggerirei di creare una classe astratta Clock che è come Ticker ma per ottenere tempo di orologio da muro in millis.

+0

Grazie per il feedback Colin. Segnerò Christoph la "risposta" anche se voi dite la stessa cosa perché ho finito per usare l'esatto Orologio che ha definito. Se potessi segnare 2 risposte, saresti # 2 :) Purtroppo, ho anche deciso di usare joda-time così, il mio orologio non avrebbe avuto senso tornare alla guava. Questo è un peccato. –