2016-04-30 21 views
0

Zuerst bin ich neu in Java, also hoffentlich ist das nicht etwas furchtbar Einfaches, aber ich versuche ein paar Unit-Tests zu machen und ich bekomme nicht das alte grüne Licht in Eclipse. Zu meinem Problem:Objects.equals für jUnit test

Also, ich habe zwei Objekte, sowohl der Klasse Fraktion und ich versuche einfach sicherzustellen, dass meine Methode (MultiplyThem) ist .... äh ... funktioniert einwandfrei.

-Code (herausgegeben zu zeigen, was ich habe jetzt):

private Fraction newFraction, otherFraction, thirdFraction; 

@Before 
public void setUp(){ 
    newFraction = new Fraction(2, 3); 
    otherFraction = new Fraction(1, 5); 
    thirdFraction = new Fraction(2, 15); 
} 

@Test 
public void testMultiplyEm() { 
    System.out.println(newFraction.multiplyEm(otherFraction)); 
    System.out.println(thirdFraction); 
    assertEquals("Fractions don't equal", newFraction.multiplyEm(otherFraction), thirdFraction); 
} 

Bei dem Verfahren multiplyEm, ist der Rückgabetyp eine Fraktion und es multipliziert zwei Zähler und zwei Nennern vor simplify auf einer anderen Funktion aufgerufen aufrufen. Dann gibt es die vereinfachte Fraktion zurück.

Ich benutzte System.out.println auf den beiden einzeln und bekam genau das gleiche auf den Bildschirm gedruckt. Ich weiß, das bedeutet nicht immer, dass sie gleich sind, aber vielleicht ist Objects.equals nicht das, was ich hier verwenden sollte. Die Objekte sind einfach zwei Eingänge: Fraction x = new Fraction(int y, int z).

Ich bin mir nicht sicher, warum das den Test nicht besteht. Hat jemand Ideen? Wäre dankbar für eine Möglichkeit, einen Unit Test dafür richtig zu schreiben!

Fraktion Klasse Methode multiplyEm:

public Fraction multiplyEm(Fraction otherFraction){ 
     int newNumerator = this.numerator * otherFraction.numerator; 
     int newDenominator = this.denominator * otherFraction.denominator; 
     Fraction newFraction = new Fraction(newNumerator, newDenominator); 
     return newFraction; 
    } 
+0

Was gedruckt wird, ist irrelevant. Objects.equals() verwendet fraction.equals (fraction2). Also, wenn Sie gleich (Objekt) nicht überschrieben haben, dann ist ein Bruch nur gleich zu sich selbst. –

+0

Haben Sie die Methoden equals und hashCode für die Klasse Fraction implementiert? Die Assert.assertEquals und Objects.assertEquals delegieren beide an Fraction.equals, um die Gleichheit zu überprüfen. –

+0

Ich denke, Sie fragen, ob ich Fraction.equals irgendwo in meiner Fraktionsklasse (oder .hashCode) verwendet habe? Wenn du das fragst, nein, habe ich nicht. Ich denke, ich sollte meinen Code auch aus der Klasse veröffentlichen. Vielleicht ist das, wo ich wirklich etwas vermasselt – drawnitsud

Antwort

3

Sie führen in der Differenz zwischen Objektidentität und Gleichheit. Die equals-Methode überprüft entweder die Identität oder die Gleichheit basierend auf der Implementierung. Der Operator == prüft immer die Identität eines Objekts.

Die Objects.equals-Methode überprüft auf Nullverweise und delegiert dann die Überprüfung an die Equals-Methode des ersten Arguments.

Die von der Object-Klasse geerbte equals-Methode überprüft die Identität der Objekte. Dass die Objektreferenz gleich ist. Die Klasse Fraction sollte die equals-Implementierung überschreiben. Es gibt einige rules für die korrekte Implementierung der Equals-Methode. Es gibt einen Vertrag für die equals- und hashCode-Methoden, die beachtet werden müssen, damit die Java-Sammlungen ordnungsgemäß funktionieren.

Im JUnit-Framework ist eine assertEquals-Methode enthalten. Dies ist die Methode, die normalerweise zum Testen der Gleichheit in einem Komponententest verwendet wird.

+0

Ahhh, ich erkannte endlich, was Sie vorschlugen. Ich muss die equals() -Methode selbst überschreiben! Ich habe es getan und es hat funktioniert. Vielen Dank! Außerdem mag ich [diese Seite] (http://www.geeksforgeeks.org/overriding-equals-method-in-java/) für einfache Erkundung. – drawnitsud