Dieses Blog durchsuchen

Mittwoch, 5. Januar 2011

Das Rad neu erfinden (1)

Manchmal machen auch die kleinen Dinge schon Probleme.

Da ist die Klasse Datum, die auch mit einer sprechenden Zeichenkette wie "TODAY" initialisiert werden soll.

Man sollte nun denken, dass folgender Test grün läuft, wenn er nicht gerade um 23:59:999 läuft:


Datum datum1 = new Datum(Datum.TODAY);
Thread.sleep(1);
Datum datum2 = new Datum(Datum.TODAY);
Assert.assertEquals(datum1, datum2);


Ein Blick in die Implementierung zeigt, warum der Test ROT läuft: Ein

new Datum(Datum.TODAY);

ruft nur ein

new GregorianCalendar();

auf. Der GregorianCalendar hält aber neben dem Datum auch die Zeit. Die equals - Methode der Datum Klasse stützt sich dann auch vollständig auf den GregorianCalender ab:

return this.cal.equals(cal);

Dieser wiederum hält die Millisekunden nach dem ....

Immerhin: Nach 5 Jahren Projekt ist das Problem dann auch mal zu Tage getreten. Ein Unit-Test war vorhanden, aber niemand ist auf die Idee gekommen, dass dieses ein sinnvoller Constraint sein könnte.

Merke: Wenn Du schon das Rad neu erfindest und ein "eigenes Datum" brauchst, dann teste besonders gründlich und .... vollständig.

Keine Kommentare:

Kommentar veröffentlichen