我正在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 {
}
}
答案 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作为半径。使用这些类型可能很棘手,因为它们不精确。 单元测试框架为这种情况提供了特殊的比较方法:
所以你会使用例如
assertEquals(6, circle1.getRadius(), 0.0001);
答案 3 :(得分:0)
错误必须在Circle
类中。你的测试虽然有一些小缺陷,但似乎没问题。
@Before
方法setUp
命名。tearDown
方法,因为它是空的。您也不需要将其命名为tearDown
。assert
,circle1
出错了,你永远不会测试circle2
和circle3
。实际上,您应该查找参数化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{...}
}
现在,测试一下:
new Circle(-10.0)
抛出。new Circle(Double.NaN)
抛出,new Circle(10.0)
成功。(new Circle(10.0)).getRadius()
返回10
。(new Circle(10.0)).getCircumference()
返回约31.4159
。Circle
实施Serializable
。