Ich habe eine Methode, die unterschiedliche Logik für Daten implementiert, die aus einer Datenbank abgerufen werden, abhängig davon, was das aktuelle Datum ist.
Ich möchte es testen, indem ich mit dem Unit-Test Objekte erstellen, sie in der DB speichern und die getestete Methode aufrufen kann. Um vorhersehbare Ergebnisse zu erzielen, muss ich jedoch jedes Mal das Systemdatum ändern, und ich weiß nicht, wie man das in Java macht.
Vorschläge?
Sie können Ihre erwarteten Ergebnisse mit dem aktuellen Datum generieren.
Oder Sie schreiben Ihr System, um ein Datum / eine Uhrzeit zu verwenden, die Sie beim Testen angeben (anstatt der Uhr). Auf diese Weise ist die Zeit immer, was der Test erwartet.
Ich benutze etwas wie
%Vor%In Tests verwende ich eine FixedTimeSource, die datengesteuert sein kann, z. festgelegt durch Eingänge / Ereignisse. In der Produktion verwende ich eine VanillaTimeSource.INSTANCE, die Zeiten in Eingaben / Ereignissen ignoriert und die aktuelle Zeit verwendet.
Sie müssen etwas in Ihre Klasse einfügen, mit dem Sie die Art und Weise anpassen können, wie die Zeit dargestellt wird.
Zum Beispiel
%Vor%Jetzt können Sie in Ihren Komponententests eine falsche Implementierung des Zeitgebers bereitstellen. Im echten Produktionscode können Sie einfach die aktuelle Datumszeit zurückgeben.
Ich hatte in letzter Zeit ein ähnliches Problem mit Code, den ich nicht zu oft umgestalten konnte (Zeitbeschränkungen, wollte nicht versehentlich etwas kaputt machen). Es hatte eine Methode, die ich testen wollte, die System.currentTimeMillis () und der Fall, den ich testen wollte, davon abhängen würde, was dieser Wert zurückgab. Etwas wie:
%Vor%Um Komponententests zu ermöglichen, habe ich die Klasse neu strukturiert, so dass es eine Hilfsmethode gab, die geschützt war
%Vor%und diese Methode wurde von doStuff () aufgerufen. Das änderte nichts an der Funktionalität, bedeutete aber nun, dass ich, wenn ich es im Unit-Test anrufe, diese überschreiben könnte, um einen bestimmten Wert zurückzugeben, wie
%Vor%Dies bedeutet jedoch, dass ich die Schnittstelle meiner Klasse verschmutzt habe, so dass Sie möglicherweise entscheiden, dass die Kosten zu hoch sind. Es gibt wahrscheinlich bessere Möglichkeiten, wenn Sie den Code mehr refaktorieren können.
Tags und Links java unit-testing date time