由于是初次接触测试,我就先从单元测试开始了。没想到初次学习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类型就可以了。
例子: