Unit testet zeitbasierte Logik in Java

8

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?

    
Alex 23.02.2012, 09:16
quelle

3 Antworten

14

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.

    
Peter Lawrey 23.02.2012, 09:21
quelle
8

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.

    
Jeff Foster 23.02.2012 09:20
quelle
2

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.

    
matt freake 23.02.2012 09:31
quelle

Tags und Links