iBaffiPro ha scritto:
Clock orologio = Clock.fixed(istante, fusoOrario);
OffsetDateTime dataOra = OffsetDateTime.now(orologio);
No, sbagliato. NON ti serve lì il Clock.fixed. Lo ripeto: Clock.fixed si usa praticamente quasi esclusivamente nel contesto degli unit-test perché serve sostanzialmente per "fissare" il tempo di un now().
Ok, vediamo meglio con un esempio più pratico.
ESEMPIO:
Hai una classe User dove tra altre cose c'è un Instant
passwordUpdateInstant, l'istante in cui la password è stata creata (o aggiornata).
public class User {
private Instant passwordUpdateInstant;
// metodi getter/setter ecc...
}
Poi c'è una classe PasswordStatus che descrive se la password è scaduta e quando scade:
public class PasswordStatus {
private boolean expired;
private Instant expireInstant;
// metodi getter/setter ecc...
}
Poi in uno UserService (NON conta ora se c'è Spring o no di mezzo):
public class UserService {
public PasswordStatus getPasswordStatus(User user, int daysDuration) {
// check precondizioni .... (es. daysDuration non negativo)
Instant expireInstant = user.getPasswordUpdateInstant().plus(daysDuration, ChronoUnit.DAYS);
Instant now = Instant.now();
PasswordStatus status = new PasswordStatus();
status.setExpired(now.compareTo(expireInstant) >= 0);
status.setExpireInstant(expireInstant);
return status;
}
}
La implementazione mi pare abbastanza semplice e comprensibile: dato lo User e un numero di giorni di "validità", mi dice lo stato di scadenza o no della password. Non ho messo check su precondizioni varie ma NON ha importanza ...
Ora: questo getPasswordStatus è testabile? NO, non è testabile. O perlomeno per dirlo meglio: è
molto difficile testarlo.
Per un motivo molto semplice: quel
now() che usa sempre la data/ora di sistema.
Due test ragionevoli da fare potrebbero essere questi. Dato un User con passwordUpdateInstant uguale a 2021-10-
11T11:22:33.123Z
a) verificare che con una data "now" del 2021-10-21T11:22:33.123Z la password sia "scaduta"
b) verificare invece che con un "now" 1 millisecondo prima, ovvero 2021-10-21T11:22:33.12
2Z la password sia ancora valida
Domanda per te: COME faresti dei test del genere se non puoi sapere/controllare la data/ora "corrente" ??
Pensaci ....
P.S. piccola risposta: UserService andrebbe innanzitutto rifattorizzato per usare Clock.