Java 8 eingeführt java.time.Clock
, die als Argument für viele andere java.time
Objekte verwendet werden können, so dass Sie eine echte oder gefälschte Uhr in sie injizieren können. Zum Beispiel, ich weiß, dass Sie eine Clock.fixed()
erstellen und dann Instant.now(clock)
anrufen können und es wird die feste Instant
zurückgeben, die Sie zur Verfügung gestellt haben. Das klingt perfekt für Unit-Tests!Einheit testet eine Klasse mit einem Java 8 Uhr
Allerdings habe ich Probleme herauszufinden, wie man das am besten nutzt. Ich habe eine Klasse, ähnlich der folgenden:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
Jetzt möchte ich diesen Code Einheit testen. Ich muss clock
einstellen können, um feste Zeiten zu produzieren, damit ich method()
zu verschiedenen Zeiten testen kann. Natürlich könnte ich Reflektion verwenden, um das Element clock
auf bestimmte Werte zu setzen, aber es wäre schön, wenn ich nicht auf Reflexion zurückgreifen müsste. Ich könnte eine öffentliche setClock()
Methode erstellen, aber das fühlt sich falsch an. Ich möchte kein Argument Clock
zu der Methode hinzufügen, da der echte Code nicht mit dem Übergeben einer Uhr betroffen sein sollte.
Was ist der beste Ansatz für die Handhabung? Das ist neuer Code, damit ich die Klasse reorganisieren kann.
Edit: Um zu verdeutlichen, muss ich in der Lage sein, ein einzelnes MyClass
Objekt zu konstruieren, aber in der Lage zu sein, dass ein Objekt zwei verschiedene Uhrwerte sehen kann (als ob es eine reguläre Systemuhr wäre). Daher kann ich keine feste Uhr in den Konstruktor übergeben.
* Nun möchte ich diesen Code testen * Sie sollten angeben, welches Verhalten Sie von 'MyClass' erwarten. Das würde den Ansatz dazu bestimmen, hier zu folgen. – Jubobs
Im Anschluss daran: Ich denke, es kommt im Grunde darauf an, dass man den "Clock.fixed" für Unit-Tests nicht so verwenden kann, wie ich es mir erhofft habe. Normale Spottansätze sind erforderlich. – Mike