模拟一个方法并返回传递的类的参数

时间:2018-01-11 15:17:22

标签: java mockito

我有一个类THAT.class,如下所示:

class THAT {
    int aVar;
}

实际上我想模拟一个类的方法,即METH,以类THAT作为参数。作为返回,我希望得到THAT类的变量aVar,如下所示:

Mockito.when(THIS.METH (Matchers.any(THAT.class), ).thenReturn(THAT.aVar);

我怎么能意识到这一点?

3 个答案:

答案 0 :(得分:2)

关于"技术方式"其他答案是正确的。解决你的问题。

但你应该明白:可能你正在使用"嘲笑"错误的方式。

你知道,你只使用模拟来实现足够的"控制你正在测试的代码"如所须。含义:一旦你开始做"复杂"您的模拟规范中的内容很可能是您创建难以测试生产代码 - 现在您转向使用复杂测试用例设置来修复该问题的创可贴

您应该做其他事情:寻找重新编写生产代码的方法。因此,它变得易于测试

喜欢:而不是"允许"对于任何类型的That对象 - 仅预期并使用特定实例。如:

when(foo.bar(whatever)).thenReturn(whatever);

允许任意输入是没有意义的。你应该努力尽量减少自由度"你的模拟被指定为。

答案 1 :(得分:1)

您可以使用ArgumentCaptor捕获参数并从中返回值。

final ArgumentCaptor<THAT> thatCaptor = ArgumentCaptor.forClass(THAT.class);

doAnswer (invocation -> {
   return thatCaptor.getValue().getAVar()//use the variable directly if its public
}).when(This).METH(thatCaptor.capture());

答案 2 :(得分:1)

您可以使用doAnswer返回特定于呼叫的值

doAnswer (invocation -> {
   return invocation.getArgument(0);
}).when(This.METH(Matchers.any(THAT.class)));