JUnit测试getter方法不起作用

时间:2013-10-15 15:08:39

标签: java eclipse junit

我正在Eclipse中进行Java练习,以将JUnit测试添加到现有项目中。这不是一个任务或任何东西,只是一种习惯Eclipse的方法(我之前一直在使用BlueJ)。 但是,我写的两种测试方法似乎并不起作用。由于某些原因,我创建的Circle对象(具有半径字段,我将其设置为6,8和2到3个不同的圆)保持默认为半径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 个答案:

答案 0 :(得分:1)

getRadius返回的值很可能是0.0基元类型的默认值double

确保在Circle

的构造函数中指定了半径
public Circle(double radius) {
    this.radius = radius;
}

以便getRadius

可以返回该值
public double getRadius() {
   return radius;
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

所以你会使用例如

 assertEquals(6, circle1.getRadius(), 0.0001);

答案 3 :(得分:0)

错误必须在Circle类中。你的测试虽然有一些小缺陷,但似乎没问题。

  1. 由于您使用的是JUnit 4注释,因此无需为@Before方法setUp命名。
  2. 您不需要tearDown方法,因为它是空的。您也不需要将其命名为tearDown
  3. 这些类应该只有一个assertcircle1出错了,你永远不会测试circle2circle3。实际上,您应该查找参数化JUnit测试
  4. 那么,你的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