JUnit ruft welche equals Methode



  • Hi !

    Ich habe folgende Klasse geschrieben, die Brüche verwaltet:

    package SimplexAlgorithmus;
    
    public class Fraction {
    
    	public int numerator;
    	public int denominator;
    
    	public Fraction( int numerator , int denominator ) {
    		this.numerator = numerator;
    		this.denominator = denominator;
    	}
    
    	public Fraction reduce() {
    
    		int gcd = gcd( this.numerator , this.denominator );
    		System.out.println("before: " + this.numerator + "/" + this.denominator );
    		this.numerator = this.numerator / gcd;
    		this.denominator = this.denominator / gcd;
    		System.out.println("after : " + this.numerator + "/" + this.denominator );
    		return new Fraction( this.numerator , this.denominator );
    	}
    
    	public int gcd( int a , int b ) {
    		if( b % a  == 0 ) return a;
    		if( b == 0 ) return a;
    		return gcd( b , a % b ); 		
    	}
    
    	public boolean equals( Fraction frac ) {
    		System.out.println("equals in fraction");
    		if( frac.numerator != this.numerator || frac.denominator != this.denominator )
    			return false;
    		return true;
    	}
    }
    

    Dazu habe ich folgende TestCases geschrieben:

    package SimplexAlgorithmus;
    
    import junit.framework.TestCase;
    
    public class FractionTest extends TestCase {
    
    	Fraction frac;
    
    	public void testGcd() {
    		Fraction frac = new Fraction( 1 , 2 );
    		assertEquals( 1 , frac.gcd( 1 , 1 ) );
    		assertEquals( 1 , frac.gcd( 1 , 2 ) );
    		assertEquals( 2 , frac.gcd( 2 , 4 ) );
    		assertEquals( 1 , frac.gcd( 1 , 13 ) );
    		assertEquals( 1 , frac.gcd( 3 , 4 ) );
    		assertEquals( 1 , frac.gcd( 1 , 1 ) );
    		assertEquals( 1024 , frac.gcd( 1024 , 2048 ));
    		assertEquals( 2 , frac.gcd(2 , 100000) );
    		assertEquals( 3 , frac.gcd( 3 , 9 ) );
    		assertEquals( 3 , frac.gcd( 9 , 3 ) );
    		assertEquals( 9 , frac.gcd( 27 , 9) );
    		assertEquals( 7 , frac.gcd( 21 , 14 ) );
    	}
    
    	public void testReduceFraction() {
    		 frac = new Fraction( 2, 4 );
    		assertEquals( new Fraction( 1 , 2 ) , frac.reduce() );
    		/*frac = new Fraction( 1 , 13 );
    		assertEquals( new Fraction( 1 , 13) , frac.reduce() );*/
    	}
    
    }
    

    Allerdings bleibt der Balken rot wenn ich reduceFraction teste. Eigentlich sollte JUnit doch die equals Methode des Objekts Fraction aufrufen oder hab ich da was falsch verstanden ?

    Grüße
    Tom



  • Ich glaube du musst, wenn du die equals-Methode redefinierst, auch gleichzeitig die hashCode-Methode redefinieren. Dann sollte das bei JUnit durchlaufen



  • "public boolean equals( Fraction frac )" wird nicht aufgerufen. Wenn du equals überschreibts dann "public boolean equals( Object other )", sonst wirds nie richtig aufgerufen. hashCode sollte man dann auch immer überschreiben, da sonst Maps usw. nicht mehr funktionieren können. Ach und bei equals überprüfen, ob other instance of Fraction und nicht null ist.


Anmelden zum Antworten