JUnit4编写圆面积计算参数化测试用例报错解决方案
JUnit 4 圆面积计算参数化测试修正方案
错误原因
- JUnit 4 中
Assert.assertEquals(double expected, double actual)方法已被正式废弃:浮点数运算存在固有精度误差,框架强制要求调用三参数版本的方法,传入第三个非负delta值(允许的最大误差范围)完成比较。原测试代码虽然定义了delta字段,但调用断言时未传入该参数,直接触发运行时抛出Use assertEquals(expected, actual, delta) to compare floating-point numbers错误。 - 原测试参数中配置的delta值为负数,属于无效配置:delta代表断言允许的预期值与实际值的绝对差值上限,取值必须大于等于0。
- IDE提示
Circle类中的findarea(int)方法不支持传入(int, double)类型参数是废弃API触发的误报,修正断言方法的传参后该提示会自动消失。
修正后可直接运行的测试代码
package BasicTesting; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class CircleTest { private final int input; private final double expected; private final double delta; // 构造函数绑定测试参数 public CircleTest(int input, double expected, double delta) { this.input = input; this.expected = expected; this.delta = delta; } @Parameters public static Iterable<Object[]> testConditions() { // 当前业务代码pi取两位小数,delta设为0.001即可满足精度校验要求,必须为非负值 return Arrays.asList(new Object[][] { {1, 3.14d, 0.001d}, {2, 12.56d, 0.001d}, // 可自行追加边界测试用例,比如半径为0、负数半径等场景 {0, 0d, 0.001d} }); } @Test public void testFindArea() { // 调用三参数非废弃断言API,匹配方法签名要求 assertEquals(expected, Circle.findarea(input), delta); } }
补充说明
被测的
Circle.findarea是静态方法,不需要实例化Circle对象即可调用,原测试类中创建的Circle ob实例属于冗余代码,不影响运行但可以删除。如果需要扩展测试场景,直接在testConditions的参数列表中追加对应测试数据即可。
内容的提问来源于stack exchange,提问作者Julie
相关产品推荐
相关产品推荐

