【问题标题】:How to test a function which calls another function when doing unit tests? [duplicate]如何在进行单元测试时测试调用另一个函数的函数? [复制]
【发布时间】:2017-01-18 09:06:59
【问题描述】:

我正在为我的程序做单元测试,但我遇到了问题。我不知道如何处理函数A调用函数的情况,我只是要测试函数A。据说我应该创建一个存根模块来模拟存根模块的函数。但我只是不知道JUnit 该怎么做。 例如:

public class compute
{
    public int multiply(int a,int b)
    {
        return a*b;
    }
    public int cube(int a)
    {
        return(multiply(multiply(a,a),a);
    }
}

那么,在这种情况下,如何为函数cube()编写测试代码?如何模拟multiply()

【问题讨论】:

  • 我认为在这种情况下没有必要存根或模拟任何东西。
  • 感谢您的建议,但您能否请教我在什么情况下需要存根或模拟,以及为什么在这种情况下不需要它们?如果我不使用存根,那么如果函数 multiply() 确实包含错误,我该如何找出错误?
  • 如果 multiply 函数有错误,您将在为 multiply 方法编写的测试用例中了解它。

标签: java unit-testing junit


【解决方案1】:

可能没有理由在这里模拟任何东西,实际上使用你的 cube() 方法,因为它是有问题的。但是,如果需要,您可以通过使用诸如 Mockito 之类的模拟框架来创建部分模拟(即模拟类的某些方法但为其他方法调用真实代码)来单独测试类的方法 或者简单地覆盖匿名类中的 multiply() 方法,如下所示尽管您需要将多维数据集中的代码更改为 * multiply(a, a)

@Test
public void testCube(){
    compute c  = createMock(9);
    Assert.assertTrue(27, c.cube(3));
}

public compute createMock(final int result){
    compute c = new compute(){
        @Override
        public int multiply(int a, int b){
            return result;
        }
    };
}

【讨论】:

    【解决方案2】:

    如果您迫切希望模拟这个方法,可以通过子类化这个类并在那里提供相关方法的模拟实现来完成。

    也就是说,在这种情况下,实际上没有必要,因为您并没有真正依赖任何第三方对象。如果您以后决定更改多维数据集的实现以不使用乘法方法,则必须重写测试。

    【讨论】:

      【解决方案3】:

      您无需在此处创建存根/模拟来模拟multiply 方法。

      您通常在调用不同对象的方法时使用它们。例如,从服务类调用 dao 类,然后对 dao 类进行存根/模拟。说过,正如 Alan 所指出的,您始终可以使用部分模拟/匿名类/覆盖来存根/模拟被测类的某些功能。

      在您的情况下,您只需要按原样测试多维数据集方法,无需模拟乘法。

      【讨论】:

      • 隔离测试类的每个方法也是一种有效的方法。
      • @AlanHay 同意并相应地更正了我的陈述。
      猜你喜欢
      • 1970-01-01
      • 2018-11-20
      • 2019-04-15
      • 1970-01-01
      • 2017-01-03
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多