Vergleich der Daten mit JUnit Tests
Hallo, ich bin neu auf der Seite und habe ein Problem mit meiner Anwendung mit JUnit-Tests. Mein Problem ist wenn ich versuche zu vergleichen, die Datum-Methode mit sich es schlägt immer fehl. Ich druckte das Date-Objekt in dem test, um zu sehen, das problem und am Ende immer mit dem Namen des Pakets und zufälligen Buchstaben. Hier ist der Date-Konstruktor:
public class Date
{
SimpleDateFormat dformat = new SimpleDateFormat("dd-MM-yyyy");
private int day;
private int month;
private int year;
public Date()
{
String today;
Calendar present = Calendar.getInstance();
day = present.get(Calendar.DAY_OF_MONTH);
month = present.get(Calendar.MONTH);
year = present.get(Calendar.YEAR);
present.setLenient(false);
present.set(year, month - 1, day, 0, 0);
today = dformat.format(present.getTime());
System.out.println(today);
}
Hier ist mein test:
@Test
public void currentDay()
{
Date current = new Date();
System.out.println(current);
assertEquals("today:", current, new Date());
}
Doch das Ergebnis schlägt immer fehl und ich bekomme etwas, das auf den Linien von:
comp.work.wk.Date@d3ade7
Jede mögliche Hilfe würde geschätzt.
Erster Vorschlag: geben Sie nicht Ihre eigenen Klassen, die dieselben Namen wie diejenigen in
Nächste Vorschlag: wenn du gehst, zu behaupten, dass zwei verschiedene Objekte gleich sind, müssen Sie überschreiben
Nächste Vorschlag: wenn Sie möchten, eine anständige string-Darstellung, überschreiben
Wenn Sie die Joda-Time - Bibliothek statt der lästigen
java.util
.Nächste Vorschlag: wenn du gehst, zu behaupten, dass zwei verschiedene Objekte gleich sind, müssen Sie überschreiben
equals
(und hashCode
für geistige Gesundheit).Nächste Vorschlag: wenn Sie möchten, eine anständige string-Darstellung, überschreiben
toString
.Wenn Sie die Joda-Time - Bibliothek statt der lästigen
java.util.Date
& java.util.Calendar
Klassen, dann alle drei von Jon Skeet ist klug Vorschläge wäre gelöst.InformationsquelleAutor user3276602 | 2014-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Standard-equals-Objekt vergleicht Speicherbereiche. Wenn beide Objekte auf denselben Speicherbereich nur dann druckt es gleich, das ist nicht der Fall in Ihrem Programm. da Sie auf zwei verschiedene Speicherplätze es ist immer was falsch, die erwartet wird.
Wenn Sie glauben, Ihr assertEquals(date1,date2) - Methode sollte true zurückgeben, da die Inhalte gleich sind, dann sollten Sie das überschreiben der equals-Methode. Und immer wenn Sie equals überschreiben, die Sie überschreiben sollten, hashcode () - Methode auch, um sicherzustellen, dass können Sie getrost verwenden Sie Ihre Instanz der Klasse als Schlüssel in jeder hashing-basierte Sammlung wie HashMap oder HashSet.
Hier ist ein link, die erklären, wie das überschreiben von equals() und hashcode () - Methode
http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html
Und nicht den Namen Ihrer Klasse, genau wie bei jedem API-Klasse wie Jon Skeet vorgeschlagen.
Hoffe, das hilft.
Sie sind willkommen 🙂
InformationsquelleAutor Srikanth Ganji
Überschreiben des Standard-equals-Methode ist nicht notwendig. Verwenden Sie einfach Datum.compareTo() zum vergleichen zweier Datum-Objekte.
InformationsquelleAutor Karthik Kota
Obwohl die Antwort von @Shrikanth löst es dieses Problem ergibt sich auch mit normalen Date-Objekte. Zwei mögliche Lösungen sind gegeben hier:
Nutzen DateUtils.abschneiden (oder sogar DateUtils.truncatedEquals) zu vergleichen, die Datumsangaben. Dies ist etwas, das man verwenden könnte in Ihre equals-Methode, oder für normale Date-Objekte direkt in Sie assertEquals/assertTrue.
Nicht überprüfen, ob die Termine sind die gleichen, aber ob Sie nah genug, um einander (für den JUnit-test sake):
date2.getTime() - date1.getTime()
imMath.abs()
bevor Sie das kleiner-als-Vergleich. Dann werde es funktionieren, wenn entwederdate1
oderdate2
ist das ältere Datum.Obwohl Sie wissen, das neue Datum() wird immer höher sein als das ERSTELLUNGSDATUM früher, ich bin damit einverstanden, dass er den Vergleich eher robust, also bearbeitete ich Sie.
Ich denke, es ist besser
.round
statt.truncate
in Fällen, in denen die beiden Termine sind um wenige Millisekunden, die Sie bekommen können abgeschnitten zu verschiedenen Sekunden. Dies führt zu einer gelegentlich fehlerhaften test. Mit einer Rundung Ansatz, ist dies kein Problem.assertEquals(DateUtils.round(date1,Calendar.SECOND), DateUtils.round(date2,Calendar.SECOND));
InformationsquelleAutor Hans Wouters
Update Die Joda-Time-Projekt ist jetzt im Wartungsmodus, mit dem team empfehlen eine migration auf das java.Zeit-Klassen.
Diese Art von Arbeit ist viel einfacher, mit der Joda-Time Bibliothek statt der notorisch lästig Date/Calendar-Klassen.
Beispiel-Code in Joda-Time 2.3
Einige Daten...
Vergleichen...
Dump in die Konsole...
Beim laufen...
Konvertieren
Können Sie konvertieren Sie in und aus der Joda-Time-wenn es sein muss.
InformationsquelleAutor Basil Bourque
Müssen Sie überschreiben sowohl equals() und toString(). Wenn Sie equals überschreiben immer überschreiben Sie hashcode() so, dass man maps richtig funktionieren.
InformationsquelleAutor Thom