0

我正在测试我的计算器的功能:

//Calculator.java(伪)

参数1:整数

参数2:int

参数3:随机数生成器

样本:parameter1 (random parameter 3) parameter2

现在,由于参数 3(随机),我在断言中遇到问题。

我无法在断言中输入静态值,我需要先获取随机值。帮助

4

3 回答 3

2

您可以在 Calculator 类中提供一个 getter 来检索使用的运算符,但这是一种有限的方法,因为您将在对象状态中提供信息。
因此,它将始终返回最后使用的运算符。
它不是线程安全的,并且在calculate()方法中抛出异常的情况下,如果您不使用表明最后一次计算失败的东西来评估它,您可能会感到惊讶。

作为替代方法int,您可以返回一个包装结果 (int) 和有效使用的运算符的对象,而不是返回一个。

请注意,单元测试必须涵盖您的calculate()方法的所有可能场景。
由于所用算子的随机性,保证所有场景都经过测试并不是直接的。
您应该打开被测方法的 API 以选择要使用的运算符(打破随机性以进行可重复的测试)或在测试方法中执行被测方法所需的尽可能多的调用,直到涵盖所有情况。

于 2018-03-25T08:19:38.330 回答
1

您正在定义您int operatorcalculate方法。此变量的范围仅在此块内。

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;
    }

}

或者使用他提出的替代方案。

于 2018-03-25T08:33:11.450 回答
0

对于您的预期结果,您想知道所使用的(随机)运算符。这意味着您的测试实际上旨在同时测试两件事:

  • 计算器是否选择随机运算符?
  • 使用该随机运算符的结果是否正确?

从理论上讲,这会导致无限数量的测试用例。

您似乎还使用自定义方法: add(num1, num2); 乘法(num1,num2);等等。因此:

  • 对这些方法中的每一种进行单独的测试,
  • 可以在不检查操作结果的情况下测试随机方法选择(如上面所说的davidxxx

API: assertEquals(int expected , int actual) 表示代码应该是 ' expected =' 而不是 'actual =' 然后 assertEquals( expected , resultCalculate);

于 2018-03-25T17:58:14.750 回答