2013-01-03 4 views
5

Ich muss diese Methode testen - compare(). Kannst du einen Rat bekommen? Wie kann ich das besser machen (alles Teil wenn, sonst - wenn, sonst).Wie man einen Vergleicher bei Junit Test

public class AbsFigure { 

class AreaCompare implements Comparator<FigureGeneral> { 

    @Override 
    public int compare(FigureGeneral oneFigure, FigureGeneral twoFigure) { 
     double firstValue = oneFigure.area(); 
     double secondValue = twoFigure.area(); 
     int result = 0; 

     if (firstValue > secondValue) 
      result = 1; 
     else if (firstValue < secondValue) 
      result = -1; 
     else 
      result = 0; 

     return result; 
    } 
} 

Nach diesem recomendations - wir nächstes Bild haben (Danke Jungs viel!):

public AreaCompare areaCompare = new AreaCompare(); 

@Test 
public void testEqual() { 
    FigureGeneral oneFigure = new Rectangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(2.0, 2.0, "rectangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be equal", result == 0); 
} 

@Test 
public void testGreaterThan() { 
    FigureGeneral oneFigure = new Triangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(1.0, 1.0, "rectangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be greater than", result >= 1); 
} 

@Test 
public void testLessThan() { 
    FigureGeneral oneFigure = new Rectangle(1.0, 1.0, "rectangle"); 
    FigureGeneral twoFigure = new Triangle(2.0, 2.0, "triangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be less than", result <= -1); 

Alle jetzt normalen Test ist.

Antwort

12

einfach Ihre Komparator Klasse instanziiert und in Objekte passieren:

public class Test extends TestCase { 
    class AreaCompare implements Comparator<FigureGeneral> { 

     @Override 
     public int compare(FigureGeneral oneFigure, FigureGeneral twoFigure) { 
      double firstValue = oneFigure.area(); 
      double secondValue = twoFigure.area(); 
      int result = 0; 

      if (firstValue > secondValue) { 
       result = 1; 
      } else if (firstValue < secondValue) { 
       result = -1; 
      } else { 
       result = 0; 
      } 

      return result; 
     } 
    } 

    private final AreaCompare areaCompare = new AreaCompare(); 

    @Test 
    public void testEqual() { 
     FigureGeneral oneFigure = new FigureGeneral(); 
     FigureGeneral twoFigure = new FigureGeneral(); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be equal", result == 0); 
    } 

    @Test 
    public void testGreaterThan() { 
     FigureGeneral oneFigure = new FigureGeneral(); 
     FigureGeneral twoFigure = new FigureGeneral(); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be greater than", result >= 1); 
    } 

    @Test 
    public void testLessThan() { 
     FigureGeneral oneFigure = new FigureGeneral(); 
     FigureGeneral twoFigure = new FigureGeneral(); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be less than", result <= -1); 
    } 
} 
+0

Beachten Sie, dass ein Komparator nicht benötigt wird, um -1 für kleinere oder genau 1 für größere Werte zurückzugeben. Jede negative/positive Zahl reicht aus. – Puce

+0

Sie müssen diese Methode jedoch überschreiben - private void assertTrue (String message, int resultValue, int compareValues) {} –

+0

Sie initialisieren oneFigure und twoFigure auf die gleiche Weise in jedem einzelnen Test. Dies würde entweder zu einer NullPointerException oder zu mindestens einem Test führen (abhängig vom Konstruktor von FigureGeneral). – Chris311

1

Sieht schlecht für mich aus. Vielleicht von result

class AreaCompare implements Comparator<FigureGeneral> { 

    @Override 
    public int compare(FigureGeneral oneFigure, FigureGeneral twoFigure) { 
     double firstValue = oneFigure.area(); 
     double secondValue = twoFigure.area(); 
     if (firstValue > secondValue) 
      return 1; 
     else if (firstValue < secondValue) 
      return -1; 
     return 0; 
    } 
} 

schreiben mindestens Testfall loszuwerden. Eins für jeden Rückgabewert.

compare(a, b) sollten unterschiedliche Vorzeichen haben als compare(b, a) oder

compare(a, b) == compare(b, a) == 0

2

Ich hatte vor kurzem eine ähnliche Anforderung und kam mit einigen Helfer up Methoden (noch nicht als API veröffentlicht). Hier ist der Quellcode:

https://github.com/SoftSmithy/softsmithy-lib/blob/develop/softsmithy-lib-core/src/test/java/org/softsmithy/lib/Tests.java

Hier ist ein Test, der diese Utility-Methoden verwendet:

https://github.com/SoftSmithy/softsmithy-lib/blob/develop/softsmithy-lib-core/src/test/java/org/softsmithy/lib/util/PositionableComparatorTest.java

+0

es wird zu "http: // sourceforge.net/p/softsmithy/_list/hg" umgeleitet. Kannst du deinen Code genau hinterher beantworten? –

0

Nach einer wenig Beratung, guter Test:

public AreaCompare areaCompare = new AreaCompare(); 

@Test 
public void testEqual() { 
    FigureGeneral oneFigure = new Rectangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(2.0, 2.0, "rectangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be equal", result == 0); 
} 

@Test 
public void testGreaterThan() { 
    FigureGeneral oneFigure = new Triangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(1.0, 1.0, "rectangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be greater than", result >= 1); 
} 

@Test 
public void testLessThan() { 
    FigureGeneral oneFigure = new Rectangle(1.0, 1.0, "rectangle"); 
    FigureGeneral twoFigure = new Triangle(2.0, 2.0, "triangle"); 
     int result = areaCompare.compare(oneFigure, twoFigure); 
     assertTrue("expected to be less than", result <= -1); 
} 
0

Es kann besser sein, für den Vertrag zu testen und nicht für die -1/0/1 Werte (oder genauer, jeden positiven/Null/negativen Wert). Dies kann mithilfe von Hamcrest Matcher sehr präzise durchgeführt werden. Betrachten Sie das folgende Beispiel:

import static org.hamcrest.Matchers.comparesEqualTo; 
import static org.hamcrest.Matchers.greaterThan; 
import static org.hamcrest.Matchers.lessThan; 

public AreaCompare areaCompare = new AreaCompare(); 

@Test 
public void testEqual() { 
    FigureGeneral oneFigure = new Rectangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(2.0, 2.0, "rectangle"); 
    assertThat(oneFigre comparesEqualTo(twoFigure)); 
    assertThat(twoFigure, comparesEqualTo(oneFigure)); 
} 

@Test 
public void testGreaterThan() { 
    FigureGeneral oneFigure = new Triangle(2.0, 2.0, "triangle"); 
    FigureGeneral twoFigure = new Rectangle(1.0, 1.0, "rectangle"); 
    assertThat(oneFigure, greaterThan(twoFigure)); 
} 

@Test 
public void testLessThan() { 
    FigureGeneral oneFigure = new Rectangle(1.0, 1.0, "rectangle"); 
    FigureGeneral twoFigure = new Triangle(2.0, 2.0, "triangle"); 
    assertThat(oneFigure, lessThan(twoFigure)); 
} 

So müssen Sie sich nicht merken, welcher Wert für was steht und die Tests machen die Absicht klar.