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