使用JUnit出现Use assertEquals(expected,actual,delta) to compare floating-point numbers问题

本文详细介绍了在使用JUnit进行单元测试时遇到的浮点数比较错误:UseassertEquals(expected,actual,delta)tocomparefloating-pointnumbers。通过实际案例,分享了如何正确地比较浮点数,避免因精度问题导致的测试失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       由于是初次接触测试,我就先从单元测试开始了。没想到初次学习JUnit就遭遇了数据类型的问题,然后JUnit报:Use assertEquals(expected,actual,delta) to compare floating-point numbers这样的错误。该问题困扰了我一天,终于解决了。

下面我贴出我的代码:

被测试的java类:IncomeCalculator.java

内容:

import exceptions.CalcMethodException;
import exceptions.PositionException;
import method.ICalcMethod;

/**
 * 收入计算器
 * @author 32524
 *
 */
public class IncomeCalculator {

    /**
     * 计算方法
     */
    private ICalcMethod calcMethod;//这里是我写的接口
    /**
     * 当前所计算的人角色
     */
    private Position position;//这里是我写的一个枚举
    
    public void  setCalcMethod(ICalcMethod calcMethod){
        this.calcMethod=calcMethod;
    }
    
    public void setPosition(Position position){
        this.position=position;
    }
    
    public double calc(){
        if(calcMethod == null){
            throw new CalcMethodException("CalcMethod not yet maintained!!");
        }
        if(position == null){
            throw new PositionException("CalcMethod not yet maintained!!");
        }
        return calcMethod.calc(position);
    }
}
第二步:将被测的java类生成一个测试类:

测试类里的测试方法:

@Test
    public void testCalc1() {
        /*
         * 第一步: 记录 expect:表示我们希望测试的是模拟对象中的calc方法,而且测试时,参数为BOOS;
         * andReturn:并且返回值是7000.00; times:times方法执行的次数为2次;
         * 从这几句联合下面的replay来意思来看,easymock实际上是可以看做是一种基于记录加回放的过程。
         */
        EasyMock.expect(calcMethodMock.calc(Position.BOSS)).andReturn(7000.00)
                .times(2);
        EasyMock.expect(calcMethodMock.calc(Position.PROGRAMMER)).andReturn(
                5000.00);
        /*
         * re是重新的意思,play是播放的意思,replay就是重新播放,也就是回放。 回放的时候要接收一个模拟对象;
         */
        EasyMock.replay(calcMethodMock);

        /*
         */
        incomeCalc.setCalcMethod(calcMethodMock);
        try {
            incomeCalc.calc();
            fail("Exception did not occur");
        } catch (PositionException e) {
//            e.printStackTrace();
        }
        /*
         * 指定了执行的角色为BOSS 由于在上面记录times(2)设置了执行了2次, 所以这里应该输出两遍。
         */
        incomeCalc.setPosition(Position.BOSS);
        assertEquals(7000.0, incomeCalc.calc());
        assertEquals(7000.0,incomeCalc.calc());
        /*
         * 再指定一个要执行的角色为PROGRAMMER,该角色的返回值是5000 上面有程序员的假设。
         * 由于该角色的返回值是5000,所以需要判断下是不是五千。
         */
        incomeCalc.setPosition(Position.PROGRAMMER);
        assertEquals(5000.0, incomeCalc.calc());
        // 经理这里由于上面并没有进行测试,所以无法进行判断
        incomeCalc.setPosition(Position.MANAGER);
        // 判断该模拟对象中的所有方法是不是都执行了
        EasyMock.verify(calcMethodMock);
    }

    执行测试的时候,我的测试类里的  assertEquals(7000.0,incomeCalc.calc());&  assertEquals(5000.0, incomeCalc.calc());报黄色警告线,并且JUnit报了:Use assertEquals(expected,actual,delta) to compare floating-point numbers。经过了一天的盘查之后,发现是数据类型的问题。解决方式其实很简单,就是将assertEquals(7000.0,incomeCalc.calc())里面的两个参数强制转换成Double类型就可以了。

     例子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值