我有一个类,THAT.class,如下所示:
class THAT {
int aVar;
}
实际上,我想模拟一个类的方法,METH,THIS,将类THAT作为参数。作为回报,我想拥有 THAT 类的变量 aVar,如下所示:
Mockito.when(THIS.METH (Matchers.any(THAT.class), ).thenReturn(THAT.aVar);
我怎么能意识到这一点?
其他答案对于解决问题的"技术方法"是正确的。
但你应该明白:可能你用错了"嘲笑"的方式。
你看,你只使用模拟来实现对"被测试代码"的"恰到好处"的控制。 意思是:一旦你开始在你的模拟规范中做"复杂"的事情,你就有可能创建了难以测试的生产代码 - 并且你现在转向使用复杂的测试用例设置来解决这个问题的创可贴。
而你应该做别的事情:寻找返工生产代码的方法。这样就变得容易测试了。
例如:而不是"允许"任何类型的That
对象 - 只期望并使用特定的实例。如:
when(foo.bar(whatever)).thenReturn(whatever);
允许任意输入是没有意义的。相反,您应该努力最小化模拟指定的"自由度"。
您可以使用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());
您可以使用 doAnswer 返回特定于呼叫的值
doAnswer (invocation -> {
return invocation.getArgument(0);
}).when(This.METH(Matchers.any(THAT.class)));