0

我正在 Eclipse 中进行 Java 练习,以将 JUnit 测试添加到现有项目中。这不是为了分配或任何东西,只是一种习惯 Eclipse 的方式(我以前一直在使用 BlueJ)。但是,我编写的两种测试方法似乎都不起作用。由于某些原因,我创建的 Circle 对象(具有半径字段,我已将其设置为 6、8 和 2 到三个不同的圆)保持默认为半径 0,所以我的两种测试方法(实际上都有报告工作,但这是因为它正在检查圆周是否> = 0)失败。我做错了什么?我不是一个经验丰富的程序员,所以这个错误对你们大多数人来说可能很明显。

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class CircleTest {
    Circle circle1;
    Circle circle2;
    Circle circle3;
@Before
public void setUp() throws Exception {

    circle1 = new Circle(6.00);
    circle2 = new Circle(8.00);
    circle3 = new Circle(2.00);
}




@Test
public void testCircumference() {
    assertTrue(circle1.circumference() >= 0);
    assertTrue(circle2.circumference() >= 0);
    assertTrue(circle3.circumference() >= 0);

}

@Test
public void testGetter() {
    assertEquals(6, circle1.getRadius(), 1e-15);
    assertEquals(8, circle2.getRadius(), 1e-15);
    assertEquals(2, circle3.getRadius(), 1e-15);

}

@After
public void tearDown() throws Exception {
}

}
4

4 回答 4

1

返回的值很可能是原始类型getRadius的默认值0.0double

确保在的构造函数中分配了半径Circle

public Circle(double radius) {
    this.radius = radius;
}

以便可以通过以下方式返回该值getRadius

public double getRadius() {
   return radius;
}
于 2013-10-15T15:11:12.103 回答
0

错误必须在Circle类中。您的测试虽然有一些小缺陷,但看起来还不错。

  1. 由于您使用的是 JUnit 4 注释,因此您无需命名您的@Before方法setUp
  2. 您不需要tearDown方法,因为它是空的。你也不需要命名它tearDown
  3. 这些类应该只有一个assert,如果有问题circle1,你永远不会测试circle2circle3。实际上,您应该查找参数化的 JUnit 测试

那么,你的Circle班级应该是什么样的呢?这是一个想法,以及一些用于测试编写的钩子。

public class Circle implements Serializable {
    private static long serialVersionUid = ...;

    private final double radius;

    public Circle(final double radius) throws IllegalArgumentException {
        if (radius <= 0.0) {
            throw new IllegalArgumentException("Attempt to create a circle with nonpositive radius" + radius);
        }
        this.radius = radius;
    }
    public double getRadius() {...}
    public double getCircumference{...}
}

现在,测试一下:

  1. new Circle(-10.0)抛出。
  2. new Circle(Double.NaN)投掷,
  3. new Circle(10.0)成功。
  4. (new Circle(10.0)).getRadius()返回10
  5. (new Circle(10.0)).getCircumference()返回大约31.4159.
  6. Circle实现Serializable
于 2013-10-15T15:39:18.943 回答
0

看一看:http
://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 用两个词:浮点数不应该用相等来比较 - 你应该用它们的绝对差异来比较它们:a - 例如,b < 0.00001。
我认为,这是问题的根源。

于 2013-10-15T15:12:25.887 回答
0

我假设您使用 dobules 或 float 作为半径。使用这些类型可能会很棘手,因为它们并不精确。单元测试框架为这种情况提供了特殊的比较方法:

http://junit.sourceforge.net/javadoc/org/junit/Assert.html#assertEquals%28double,%20double,%20double%29

所以你会使用例如

 assertEquals(6, circle1.getRadius(), 0.0001);
于 2013-10-15T15:15:03.127 回答