我正在测试我的计算器的功能:
//Calculator.java(伪)
参数1:整数
参数2:int
参数3:随机数生成器
样本:parameter1 (random parameter 3) parameter2
现在,由于参数 3(随机),我在断言中遇到问题。
我无法在断言中输入静态值,我需要先获取随机值。帮助
我正在测试我的计算器的功能:
//Calculator.java(伪)
参数1:整数
参数2:int
参数3:随机数生成器
样本:parameter1 (random parameter 3) parameter2
现在,由于参数 3(随机),我在断言中遇到问题。
我无法在断言中输入静态值,我需要先获取随机值。帮助
您可以在 Calculator 类中提供一个 getter 来检索使用的运算符,但这是一种有限的方法,因为您将在对象状态中提供信息。
因此,它将始终返回最后使用的运算符。
它不是线程安全的,并且在calculate()
方法中抛出异常的情况下,如果您不使用表明最后一次计算失败的东西来评估它,您可能会感到惊讶。
作为替代方法int
,您可以返回一个包装结果 (int) 和有效使用的运算符的对象,而不是返回一个。
请注意,单元测试必须涵盖您的calculate()
方法的所有可能场景。
由于所用算子的随机性,保证所有场景都经过测试并不是直接的。
您应该打开被测方法的 API 以选择要使用的运算符(打破随机性以进行可重复的测试)或在测试方法中执行被测方法所需的尽可能多的调用,直到涵盖所有情况。
您正在定义您int operator
的calculate
方法。此变量的范围仅在此块内。
public class Calculate {
public int calculate(int a, int b) {
int operator = randomise(4);
switch (operator) {
case 0:
return add(num1, num2);
case 1:
return multiply(num1, num2);
case 2:
return subtract(num1, num2);
case 3:
return divide(num1, num2);
default:
return 0;
}
}
}
正如 davidxx 所说,您可以在 Calculator 类中提供一个 getter 来检索运算符:
public class Calculate {
private int operator;
public int calculate(int a, int b) {
operator = randomise(4);
switch (operator) {
case 0:
return add(num1, num2);
case 1:
return multiply(num1, num2);
case 2:
return subtract(num1, num2);
case 3:
return divide(num1, num2);
default:
return 0;
}
}
public int getOperator()
{
return operator;
}
}
或者使用他提出的替代方案。
对于您的预期结果,您想知道所使用的(随机)运算符。这意味着您的测试实际上旨在同时测试两件事:
从理论上讲,这会导致无限数量的测试用例。
您似乎还使用自定义方法: add(num1, num2); 乘法(num1,num2);等等。因此:
API: assertEquals(int expected , int actual) 表示代码应该是 ' expected =' 而不是 'actual =' 然后 assertEquals( expected , resultCalculate);