Un modo semplice è passare il tempo dall'esterno del metodo:
doSomething(long currentTime) {
//...stuff
startTime = currentTime;
//... more stuff
}
Il tuo codice di produzione che chiama il metodo può passare nel valore reale per System.currentTimeMillis (), mentre i tuoi test di unità possono passare in uno specifico valore noto.
Naturalmente, questo non è esattamente lo stesso del tuo originale. Un'altra possibilità è un po 'più complessa, ma dovrebbe simulare il comportamento del tuo originale più da vicino:
doSomething(ITimeGetter timeGetter) {
//...stuff
startTime = timeGetter.GetCurrentTime;
//... more stuff
}
Definisci l'interfaccia:
interface ITimeGetter
{
long GetCurrentTime();
}
Due implementazioni, una per il codice di produzione:
class RealTimeGetter implements ITimeGetter
{
long GetCurrentTime()
{
return System.currentTimeMillis();
}
}
Uno per i test di unità:
class TimeGetterForTests implements ITimeGetter
{
long GetCurrentTime()
{
// return a known value.
}
}
Crea un'istanza ITime appropriata al tuo scenario e passa al metodo che vuoi testare.