2016-09-07 2 views
0

Jetzt lese ich Kent Becks "Test Driven Development" und ich habe ein Problem mit dem Verständnis von "Privacy" Kapitel. Ich benutze JUnit 4 und hier ist der Code aus dem Kapitel.Sollte der Code aus dem Buch funktionieren?

Die Klasse wir prüfen:

public class Dollar { 
    private int amount; 

    Dollar(int amount) { 
     this.amount = amount; 
    } 

    public Dollar times(int multiplier) { 
     return new Dollar(amount * multiplier); 
    } 

    public boolean equals(Dollar d) { 
     return amount == d.amount; 
    } 
} 

Der Test (vollständig aus dem Buch kopiert):

public void testMultiplication() { 
    Dollar five= new Dollar(5); 
    assertEquals(new Dollar(10), five.times(2)); 
    assertEquals(new Dollar(15), five.times(3)); 
} 

ein Kapitel lesen Ich verstehe, dass dieser Test sollte funktionieren. Aber es kann nicht funktionieren, weil times Methode immer neues Objekt zurückgibt, so assertEquals s wird immer fehlschlagen.

Meine Frage ist: sollte dieser Test funktionieren? Oder ist es nur als ein Beispiel gegeben, es in eine andere Programmiersprache zu übersetzen?

+2

Diese Art von Fehler ist genau der Grund, warum die Annotation ['@ Override'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Override.html) erstellt wurde. – Bohemian

Antwort

0

Aus meinem Verständnis kann das nicht funktionieren, weil die Objekte nie gleich oder genau gleich sein werden.

Ich denke, das Buch wollte Ihnen ein allgemeines Konzept geben, im Gegensatz zu einer genauen, vollkommen richtigen Antwort, obwohl ich immer noch denke, dass Beispiele in Büchern verwendbar sein sollten.

0

Es scheint, dass assertEquals() einige Probleme beim Aufrufen der equals() -Methode hat. Beim Debugging wurde festgestellt, dass junit-Bibliotheken aus irgendeinem Grund, anstatt die überschriebene equals() -Methode aufzurufen, Reflektionen durchführen, um die richtigen Klassendefinitionen zum Aufrufen der Methoden zu finden. Es endet schließlich mit dem Vergleich der Speicherwerte der Objs. Equals() jedoch, wie andere Mitwirkende gezeigt haben, funktioniert gut.

0

Wie Kevin Grant sagt, sollte es funktionieren.

Da Sie anscheinend nur JUnit lernen, wollte ich nur hinzufügen, dass Sie die Equals-Methoden für Ihre Klassen immer überschreiben sollten. Wenn Sie dies nicht tun, prüfen Sie nur, ob die Referenzvariablen mit assertEquals() auf die gleiche Speicheradresse zeigen. Wenn Eclipse können Sie dies ganz einfach mit der rechten Maustaste irgendwo in Ihrem Code -> Quelle -> Generate hashCode() und equals() ...

1

Quelle: Junit API

Quellcode der assertEquals sagt

Wenn Sie assertEquals aufrufen, ruft es die Klasse .equals in der -Klasse auf.

Wie Bohemian erwähnt, @Override -> der equals Methode von Object Klasse gibt die Macht zu überprüfen, basierend auf unserer benutzerdefinierten Implementierung.

assertEquals(new Dollar(10), five.times(2)); 

.equals auf Menge berechnet, und es löst das Ziel.

+1

Nur um klar zu stellen, die spezifische Änderung, die benötigt wird, ist die Umsetzung von 'equals (Object)' und nicht nur 'equals (Dollar)'. @ DevdattaKs Vorschlag, dass Ihre IDE 'hashCode' und' equals' erzeugt, ist ein schneller Weg, um es richtig zu machen. –

+0

Danke Bruder! Du hilfst mir das Problem zu lösen! –

Verwandte Themen