【问题标题】:How to get the value of a variable from java class to JUnit如何从java类获取变量的值到JUnit
【发布时间】:2018-03-25 07:58:08
【问题描述】:

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

//Calculator.java(伪)

参数1:整数

参数2:整数

参数3:随机数生成器

示例:parameter1 (random parameter 3) parameter2

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

我不能在assert中输入静态值,我需要先获取random的值。帮助

【问题讨论】:

  • 可以分享Calculator的代码吗?
  • 我已经更新了我的问题@Mureinik
  • 但是如果你在calculate里面随机化操作符,为什么需要第三个参数呢?
  • 我需要 operator 值以便我可以断言。我不知道在实际的assertEquals 中输入什么我需要先计算。
  • 我不明白为什么会有这么多反对票。该问题包含一个最小、完整和可验证的示例。 OP 尝试了一些东西,并且清楚地说明了问题。

标签: java random junit parameter-passing getvalue


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      • 对每种方法分别进行测试,
      • 使得在不检查操作结果的情况下测试随机方法选择成为可能(就像上面说的davidxxx

      API:assertEquals(int expected, int actual) 表示代码应该是 'expected =' 而不是 'actual =' 然后 assertEquals(预期,结果计算);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多