Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在进行单元测试时,如何测试调用另一个函数的函数?_Java_Unit Testing_Junit - Fatal编程技术网

Java 在进行单元测试时,如何测试调用另一个函数的函数?

Java 在进行单元测试时,如何测试调用另一个函数的函数?,java,unit-testing,junit,Java,Unit Testing,Junit,我正在为我的程序做单元测试,但我遇到了一个问题。我不知道如何处理函数A调用函数的情况,我只想测试函数A。据说我应该创建一个存根模块来模拟作为存根模块的函数。但是我不知道如何通过JUnit实现这一点。 例如: public class compute { public int multiply(int a,int b) { return a*b; } public int cube(int a) { return(multip

我正在为我的程序做单元测试,但我遇到了一个问题。我不知道如何处理函数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
方法

通常在对不同对象调用方法时使用它们。例如,从服务类调用dao类,然后存根/模拟dao类。也就是说,正如Alan所指出的,您可以始终使用部分mock/anonymous类/对stub/mock的重写,只对被测试类的某些函数进行模拟


在本例中,您只需要按原样测试cube方法,而不需要模拟乘法。

可能没有理由在这里模拟任何东西,事实上,使用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;
        }
    };
}

如果您非常想模拟这个方法,可以通过将这个类子类化并提供相关方法的模拟实现来实现


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

我认为在这种情况下不需要存根或模拟任何内容。谢谢您的建议,但您能告诉我在什么情况下需要存根或模拟,以及为什么在这种情况下不需要存根或模拟吗?如果我不使用存根,那么如果函数multiply()确实包含错误,我如何找出错误?如果multiply函数有错误,您将在为multiply方法编写的测试用例中了解它。这也是一种有效的方法,可以单独测试类的每个方法。@AlanHay同意并相应地更正了我的语句。