为什么要测试方法是否被调用?

时间:2015-10-05 16:58:54

标签: unit-testing testing

我已经看过很多关于如何测试某个方法是否被调用的例子。但为什么人们想要做这种形式的测试呢?测试所述方法的结果不是更有效吗?

如果我想测试add(X,Y)只是为了看它是否被调用...为什么我不断言添加(X,Y)== X + Y?在这种情况下,我不仅要验证是否正在调用该方法,而且我实际上正在验证该方法在同一测试中正在执行的操作。

即使在测试方法被调用X次的情况下,也就是说Summation(N),它将调用add N次以获得总共N + N - 1 ... + 0;我仍然无法看到只测试添加多少次调用的价值。

有人可以给一位初级测试工程师提供一些有用的建议来理解这一点。也许一个为什么测试一个方法被调用的例子很重要,为什么不仅仅测试它的结果会更加必要?

我认为有些澄清是必要的。具体来说,我正在考虑Mockito.verify方法。为什么只想要验证方法是否被调用。我对Mockito.Verify的理解如下。

public void testSummation(){
   Calculator.Summation(X);
   //which I guess I would assume called Add() X times. 
   Verify(Calculator times(x).add();

(注意这只是一个通用的例子而不是我写过的实际代码)但是为什么要验证添加是否被称为X次?不会测试从Summation返回的正确值是否是一个更好的测试?

3 个答案:

答案 0 :(得分:1)

测试对象应该正常运行。给定一些已定义的输入,不仅可以正确设置其内部状态,还可以通过其定义的接口以正确的方式与其他对象协作。函数调用通常是对象之间定义的接口的一部分,因此测试测试对象是否遵循这些接口的规则非常重要。换句话说,使用正确的参数在正确的时间调用正确的方法并正确处理响应。

答案 1 :(得分:0)

以此为例

public Integer AddSum(Int a, Int b){
    Integer x= a+b;
    // Testing : Log message to confirm x=a+b was completed
    String f = x;
    //Testing : Log message here does NOT get called as the above statement cause code to crash
    return x;
}

一个函数可以包含很多部分,你想知道在崩溃/或检查意外数据值之前函数到达了哪一行。在示例中,如果我们只添加两个数字,它并没有真正有所作为,但只要完成其他内容,它就很重要。例如,任何代码都使用JSONObjects应该总是被记录/测试,因为它们经常会出错并且处理起来很棘手

答案 2 :(得分:0)

嗯,如你所注意到的那样,只需进行单元测试就可以了。

但是假设您正在构建一个计算器应用程序,显然当用户请求添加操作(您调用添加(X,Y))时,您可能希望将结果呈现给用户。

您当然需要测试添加操作(断言添加(X,Y)== X + Y),但是您如何测试结果是否呈现给用户?您是否需要一种方法来验证printResult(用于打印结果的方法的名称)是否被调用?