基于参数存根方法

时间:2016-02-26 05:21:11

标签: mockito stub

class ArgumentClass{
   int var;
}

class ClassMocked{
   int aMothod(ArgumentClass argumentClass){
      return anInt;
   }
}

class MyTest{
   Mock and Stub here
}

在MyTest中,我想存根一个方法,以便它返回基于ArgumentClass.var值的值。我必须一气呵成。 换句话说,我有一个测试用例,其中一个moehod被app代码调用三次,并且基于一个变量在一个参数对象中,我需要不同的返回值。我需要相应的存根。如果有办法,请告诉我。

2 个答案:

答案 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的子类,并在您的应用程序中重用它。