Ich schreibe einen Code, der Datums- und Uhrzeitberechnungen mit der aktuellen Zeit vergleicht. In der Joda-Zeit wird dies durch einen (Java) -Konstruktor erreicht, da es ein unveränderliches Objekt ist. Ich muss in der Lage sein, so zu spotten, dass new DateTime()
einen bestimmten konstanten Zeitpunkt zurückgibt, so dass ich sinnvolle Testaussagen machen kann, aber alle anderen DateTime-Methoden in Ruhe lassen kann.
Das ist widerlich. Grails mockFor(DateTime, true)
lässt mich nicht einen Java-Konstruktor verspotten, aber es gibt keine offensichtliche oder lesbare nicht-konstruktive Möglichkeit, die Zeit in Joda-Zeit zu bekommen.
Die einzigen verfügbaren Optionen scheinen Low-Level-JVM-Techniken wie JMockit oder EasyMock 3-Klasse-Spott zu beinhalten, die Grails schmerzen. Gibt es einen einfachen / direkten Weg dies zu erreichen?
Am Ende haben wir dateService
mit now()
method erstellt. In Unit Tests verspotten wir es mit
Dabei ist currentTime
ein Einheitstestklassenfeld. Dies macht die Abhängigkeit von dateService
(unsere einzige fast globale Abhängigkeit) und für src
-Klassen von Hand erforderlich.
Komponententests, OTOH, schauen ziemlich klar damit.
Ich weiß, dass dies bereits akzeptiert wurde, aber mit Joda-time kannst du es einfrieren und einstellen, was immer du willst. So können Sie Zeit einfrieren, Zeit vorverlegen, zeitlich rückwärts gehen. Vorausgesetzt, Sie verwenden Joda konsistent, erhalten Ihre Objekte "jetzt" so wie Sie es eingestellt haben.
%Vor%