class ArgumentClass{
int var;
}
class ClassMocked{
int aMothod(ArgumentClass argumentClass){
return anInt;
}
}
class MyTest{
Mock and Stub here
}
在MyTest中,我想存根一个方法,以便它返回基于ArgumentClass.var值的值。我必须一气呵成。 换句话说,我有一个测试用例,其中一个moehod被app代码调用三次,并且基于一个变量在一个参数对象中,我需要不同的返回值。我需要相应的存根。如果有办法,请告诉我。
答案 0 :(得分:0)
如果我理解正确,你可以用mockito以两种不同的方式做到这一点。如果您将ClassMocked声明为模拟,您应该能够这样说:
when(mock.aMothod(eq(specificArgument))).thenReturn(1);
when(mock.aMothod(eq(anotherSpecificArgument))).thenReturn(2);
如果你想这样做,不管传递的参数是什么,你想根据方法的调用次数返回值,你可以说:
when(mock.aMothod(any())).thenReturn(1, 2);
这表示当调用aMothod而不管传递的参数(any())时,它将在第一次调用1中返回,当第二次调用时它将返回2.
答案 1 :(得分:0)
虽然您可以按照正确的顺序设置模拟返回值,例如karruma's answer,但您也可以使用Answer来计算模拟值:
when(mock.aMothod(any())).thenAnswer(new Answer<Integer>() {
@Override public Integer answer(InvocationOnMock invocation) {
ArgumentClass argument = invocation.getArguments()[0];
return calculationBasedOn(argument);
}
});
或者在Java 8和Mockito 2 beta中(未经测试,可能需要装箱/拆箱):
when(mock.aMothod(any())).thenAnswer(invocation ->
calculatebasedOn(invocation.getArgumentAt(0, ArgumentClass.class)));
虽然我在顶部示例中有一个匿名内部类,但很自然地,您可以创建一个名为Answer的子类,并在您的应用程序中重用它。