9

このメソッドをテストする必要があります - compare()。アドバイスをもらえますか?これをどれだけうまくやれるか(if、else-if、elseのすべての部分)。

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;
    }
}

この推奨事項の後、次の写真があります(ありがとうございました!):

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);

すべてが正常なテストになりました。

4

5 に答える 5

17

コンパレータ クラスをインスタンス化し、オブジェクトを渡すだけです。

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);
    }
}
于 2013-01-03T18:33:30.547 に答える
1

-1/0/1 値 (より正確には、任意の正/ゼロ/負の値) ではなく、コントラクトをテストする方がよい場合があります。これは、非常に簡潔な方法で Hamcrest マッチャーを使用して行うことができます。次の例を検討してください。

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));
}

したがって、どの値が何を表しているかを覚えておく必要はなく、テストによって意図が明確になります。

于 2015-11-11T23:45:22.190 に答える
1

私には間抜けに見えます。多分取り除く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;
    }
}

少なくともテスト ケースを記述します。戻り値ごとに 1 つ。

compare(a, b)compare(b, a) orとは異なる符号を持つ必要があります

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

于 2013-01-03T18:31:53.990 に答える
1

最近、同様の要件があり、いくつかのヘルパー メソッドを思いつきました (ただし、まだ API として公開されていません)。ソースコードは次のとおりです。

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

以下は、これらのユーティリティ メソッドを使用するテストです。

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

于 2013-01-03T20:00:33.873 に答える
0

少しのアドバイスの後、良いテスト:

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);
}
于 2013-01-05T20:33:55.450 に答える