Joda Time hat ein schönes DateTimeUtils.setCurrentMillisFixed () , um die Zeit zu verspotten.
Es ist sehr praktisch in Tests.
Gibt es eine Entsprechung in der java.time-API von Java 8 ?
Joda Time hat ein schönes DateTimeUtils.setCurrentMillisFixed () , um die Zeit zu verspotten.
Es ist sehr praktisch in Tests.
Gibt es eine Entsprechung in der java.time-API von Java 8 ?
Das nächste ist das Clock
Objekt. Sie können ein Clock-Objekt jederzeit (oder ab der aktuellen Systemzeit) erstellen. Alle date.time-Objekte verfügen über überladene now
Methoden, die stattdessen ein Uhrobjekt für die aktuelle Uhrzeit verwenden. Sie können also die Abhängigkeitsinjektion verwenden, um eine Uhr mit einer bestimmten Zeit zu injizieren:
public class MyBean {
private Clock clock; // dependency inject
...
public void process(LocalDate eventDate) {
if (eventDate.isBefore(LocalDate.now(clock)) {
...
}
}
}
Siehe Clock JavaDoc für weitere Details
Clock.fixed
beim Testen nützlich, währendClock.system
oderClock.systemUTC
möglicherweise in der Anwendung verwendet wird.Ich habe eine neue Klasse verwendet, um die
Clock.fixed
Erstellung auszublenden und die Tests zu vereinfachen:quelle
getClock()
Methode auch entfernen und das Feld direkt verwenden. Diese Methode fügt nur ein paar Codezeilen hinzu.Ich habe ein Feld benutzt
und dann
in meinem Produktionscode. Dann habe ich Mockito in meinen Unit-Tests verwendet, um die Uhr mit Clock.fixed () zu verspotten:
Verspottung:
Behauptung:
quelle
Ich finde mitClock
Unordnung Ihren Produktionscode.Sie können JMockit oder PowerMock verwenden , um statische Methodenaufrufe in Ihrem Testcode zu verspotten. Beispiel mit JMockit:
EDIT : Nachdem ich die Kommentare zu Jon Skeets Antwort auf eine ähnliche Frage hier auf SO gelesen habe, bin ich nicht mit meinem früheren Ich einverstanden. Das Argument hat mich vor allem davon überzeugt, dass Sie Tests nicht paralleln können, wenn Sie statische Methoden verspotten.
Sie können / müssen jedoch statisches Mocking verwenden, wenn Sie sich mit Legacy-Code befassen müssen.
quelle
Ich brauche
LocalDate
Instanz stattLocalDateTime
.Aus diesem Grund habe ich folgende Dienstprogrammklasse erstellt:
Und die Verwendung dafür ist wie folgt:
Ausgabe:
Ersetzt die gesamte Schöpfung
LocalDate.now()
bisClock.getCurrentDate()
in Projekt.Weil es eine Spring Boot- Anwendung ist. Vor dem
test
Profil Ausführung gesetzt nur einen vordefinierten Zeitpunkt für alle Tests:Und zu spring.factories hinzufügen :
quelle
Hier erfahren Sie, wie Sie die aktuelle Systemzeit für JUnit-Testzwecke in einer Java 8-Webanwendung mit EasyMock auf ein bestimmtes Datum überschreiben können
Joda Time ist sicher schön (danke Stephen, Brian, du hast unsere Welt zu einem besseren Ort gemacht), aber ich durfte sie nicht benutzen.
Nach einigen Experimenten fand ich schließlich eine Möglichkeit, die Zeit bis zu einem bestimmten Datum in der java.time-API von Java 8 mit EasyMock zu verspotten
Folgendes muss getan werden:
Was ist in der getesteten Klasse zu tun?
Schritt 1
Fügen Sie
java.time.Clock
der getesteten Klasse ein neues Attribut hinzuMyService
und stellen Sie sicher, dass das neue Attribut bei Standardwerten mit einem Instanziierungsblock oder einem Konstruktor ordnungsgemäß initialisiert wird:Schritt 2
Fügen Sie das neue Attribut
clock
in die Methode ein, die ein aktuelles Datum und eine aktuelle Uhrzeit anfordert. In meinem Fall musste ich beispielsweise überprüfen, ob ein in der Datenbank gespeichertes Datum zuvor aufgetreten istLocalDateTime.now()
, das ichLocalDateTime.now(clock)
wie folgt ersetzt habe:Was ist in der Testklasse zu tun?
Schritt 3
Erstellen Sie in der Testklasse ein Mock-Clock-Objekt, fügen Sie es in die Instanz der getesteten Klasse ein, bevor Sie die getestete Methode aufrufen
doExecute()
, und setzen Sie es anschließend wie folgt zurück:Überprüfen Sie dies im Debug-Modus, und Sie werden sehen, dass das Datum vom 3. Februar 2017 korrekt in die
myService
Instanz eingefügt und in der Vergleichsanweisung verwendet wurde und dann ordnungsgemäß auf das aktuelle Datum mit zurückgesetzt wurdeinitDefaultClock()
.quelle
Dieses Beispiel zeigt sogar, wie Instant und LocalTime kombiniert werden ( detaillierte Erläuterung der Probleme bei der Konvertierung ).
Eine Klasse im Test
Ein Groovy-Test
quelle
Mit Hilfe von PowerMockito für einen Spring Boot Test können Sie das verspotten
ZonedDateTime
. Sie benötigen Folgendes.Anmerkungen
In der Testklasse müssen Sie den Dienst vorbereiten, der das verwendet
ZonedDateTime
.Testfall
Im Test können Sie eine gewünschte Zeit vorbereiten und als Antwort auf den Methodenaufruf abrufen.
quelle