Ho avuto un problema simile di recente con il codice non ho potuto refactoring troppo (limiti di tempo, non volevo inavvertitamente rompere nulla). Aveva un metodo che volevo testare, chiamato System.currentTimeMillis() e il caso che volevo testare dipendeva da cosa restituiva quel valore. Qualcosa di simile:
public class ClassINeedToTest {
public boolean doStuff() {
long l = System.currentTimeMillis();
// do some calculation based on l
// and return the calculation
}
}
Per consentire unit test, ho refactoring la classe in modo che aveva un metodo di supporto che è stato protetto
protected long getCurrentTimeMillis() {
// only for unit-testing purposes
return System.currentTimeMillis();
}
e questo metodo è stato chiamato da doStuff(). Questo non ha cambiato la funzionalità, ma ora ha fatto sì che, quando lo chiamo io nell'unità di test, ho potuto quindi sovrascrivere questo per restituire un valore specifico, come
ClassINeedToTest testClass = new ClassINeedToTest() {
protected long getCurrentTimeMillis() {
// return specific date for my test
return 12456778L;
}
};
boolean result = testClass.doStuff();
// test result with an assert here
Questo significa tuttavia che ho inquinato la interfaccia della mia classe, quindi potresti decidere che il costo è troppo alto. Ci sono probabilmente dei modi migliori se puoi rifattorizzare di più il codice.
fonte
2012-02-23 09:31:07
cambia il tuo metodo in modo da dare effettivamente il tempo come parametro, quindi puoi testarlo dando ogni volta che vuoi. Cosa parla di questo? – belgther
Puoi dire come stai ricevendo la data e l'ora correnti? Forse il mocking funzionerebbe ... –
Per ora solo con 'new Date()', forse ho bisogno di una classe TimeProvider – Alex