Java 在进行单元测试时,如何测试调用另一个函数的函数?
我正在为我的程序做单元测试,但我遇到了一个问题。我不知道如何处理函数A调用函数的情况,我只想测试函数A。据说我应该创建一个存根模块来模拟作为存根模块的函数。但是我不知道如何通过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
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同意并相应地更正了我的语句。