Java >> Java Tutorial >  >> Java

So geben Sie den Offset eines Zeitstempels in einem DbUnit-Datensatz an

Dieser Blogbeitrag erzählt die Geschichte eines fehlgeschlagenen Integrationstests, identifiziert das Problem, das den Test nicht bestanden hat, und beschreibt, wie wir dieses Problem lösen können. Nachdem wir diesen Blogbeitrag fertiggestellt haben, werden wir

  • Kann die Probleme identifizieren, denen wir begegnen können, wenn wir Zeitstempel in DbUnit-Datensätzen verwenden.
  • Verstehen, wie wir den Offset eines Zeitstempels in einem DbUnit-Datensatz angeben können.

Fangen wir an.

Die Geschichte eines fehlgeschlagenen Integrationstests

Letzte Woche habe ich Integrationstests für Code geschrieben, der einen Zeitstempel in der UTC-Zeitzone in der Datenbank speichert. Leider ist einer meiner Integrationstests aufgrund dieses Fehlers fehlgeschlagen:

value (table=exams, row=0, col=start_time) 
expected:<2019-01-15 1[2:00:0]0> but was:<2019-01-15 1[4:00:00.]0>

Zuerst dachte ich, dass mein Code einen Fehler hat, weil es so aussah, als ob der Zeitstempel in der lokalen Zeitzone in der Datenbank gespeichert wurde. Als ich mir jedoch die Datenbank ansah (wir führen unsere Integrationstests gegen eine PostgreSQL-Datenbank durch), bemerkte ich, dass der Zeitstempel in UTC gespeichert wurde.

Deshalb bin ich zu dem Schluss gekommen, dass DbUnit diesen Zeitstempel in die lokale Zeitzone umwandeln muss, wenn es den Zeitstempel aus der Datenbank lädt, und mein Integrationstest schlägt fehl, weil mein DbUnit-Datensatz die UTC-Zeitzone verwendet hat. An diesem Punkt hatte ich zwei Möglichkeiten:

  • Ich könnte den einfachen Weg gehen und die lokale Zeitzone in meinem DbUnit-Datensatz verwenden.
  • Ich könnte versuchen, einen Weg zu finden, die UTC-Zeitzone in meinem DbUnit-Datensatz zu verwenden.

Ich wollte die erste Option aus folgenden Gründen nicht verwenden:

  • Ich wollte, dass meine DbUnit-Datensätze die gleiche Zeitzone wie die aus der Datenbank gefundenen Daten verwenden, weil dies meine Tests leichter lesbar macht.
  • Sie können die lokale Zeitzone nicht verwenden, wenn Sie Ihre Tests in mehreren Zeitzonen ausführen müssen.

Mit anderen Worten, es war an der Zeit, Google zum Laufen zu bringen. Zuerst habe ich ein paar Lösungen gefunden, die mein Problem nicht lösen, da meine REST-API die Zeitstempel in Ortszeit zurückgeben muss. Nach ein paar Stunden fand ich diesen DbUnit-Fork und den TimestampDataTypeTest Klasse.

Als ich den Quellcode von TimestampDataTypeTest las Klasse wurde mir klar, dass ich gerade die Lösung für mein Problem gefunden hatte. Als Nächstes werde ich beschreiben, wie wir den Offset eines Zeitstempels in einem DbUnit-Datensatz angeben können.

Hinzufügen des Offsets eines Zeitstempels zu einem DbUnit-Datensatz

Wenn wir den Offset eines Zeitstempels in einem DbUnit-Datensatz angeben möchten, müssen wir unseren Zeitstempel mit der folgenden Syntax angeben:[timestamp] [offset] . Schauen wir uns drei Beispiele an, die zeigen, wie wir die Offsets unserer Zeitstempel angeben können.

Zuerst , wenn wir die Zeit von der UTC-Zeit subtrahieren wollen, müssen wir den Offset angeben, indem wir die Syntax verwenden:-[subtracted time] . Wenn wir zum Beispiel eine Stunde von der UTC-Zeit abziehen wollen, müssen wir den Offset angeben, indem wir die Zeichenfolge verwenden:-0100 .

Der DbUnit-Datensatz, der die Startzeit unserer Prüfung angibt, sieht wie folgt aus:

<dataset>
 <exams id="1"
 start_time="2019-01-15 11:00:00 -0100"/>
</dataset> 

Zweiter , wenn wir Zeit zur UTC-Zeit hinzufügen möchten, müssen wir den Offset mit der folgenden Syntax angeben:+[added time] . Wenn wir zum Beispiel eine Stunde zur UTC-Zeit hinzufügen möchten, müssen wir den Offset angeben, indem wir die Zeichenfolge verwenden:+0100 .

Der DbUnit-Datensatz, der die Startzeit unserer Prüfung angibt, sieht wie folgt aus:

<dataset>
 <exams id="1"
 start_time="2019-01-15 13:00:00 +0100"/>
</dataset> 

Dritter , wenn wir die UTC-Zeit verwenden wollen, müssen wir den Offset durch die Zeichenfolge angeben:+0000 . Der DbUnit-Datensatz, der die Startzeit unserer Prüfung angibt, sieht wie folgt aus:

<dataset>
 <exams id="1"
 start_time="2019-01-15 12:00:00 +0000"/>
</dataset> 

Wir können jetzt den Offset eines Zeitstempels in einem DbUnit-Datensatz angeben. Fassen wir zusammen, was wir aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat uns vier Dinge gelehrt:

  • Wenn wir den Offset eines Zeitstempels in einem DbUnit-Datensatz angeben wollen, müssen wir unseren Zeitstempel mit der folgenden Syntax angeben:2019-01-15 12:00:00 [offset] .
  • Wenn wir die Zeit von der UTC-Zeit subtrahieren wollen, müssen wir unseren Zeitstempel angeben, indem wir die Syntax verwenden:2019-01-15 12:00:00 -[subtracted time] .
  • Wenn wir Zeit zur UTC-Zeit hinzufügen wollen, müssen wir unseren Zeitstempel angeben, indem wir die Syntax verwenden:2019-01-15 12:00:00 +[added time] .
  • Wenn wir die UTC-Zeit verwenden wollen, müssen wir unseren Zeitstempel mit der folgenden Syntax angeben:2019-01-15 12:00:00 +0000 .

Java-Tag