我有一个不返回值的方法。它接受一个列表并修改该列表的成员。显然,列表本身是可变的,其成员也是如此。
EG:我想嘲笑这个:
void modifyRequests(List<MutableObject> requests);
答案 0 :(得分:4)
好吧,各种模拟框架做提供了这样做的方法(执行调用方法时使用参数的自定义操作) - 但我强烈认为不使用嘲讽。除非您确实要在您的测试类及其协作者之间验证协议,否则您应该考虑编写伪而不是模拟。然后,您可以根据自己的喜好制作假冒行为 - 通常(IME)最终会得到更简单的测试代码。
它并不总是合适的,而且嘲讽肯定有它的位置 - 但随着时间的推移,我发现一个写得很好的假货可以用黄金来衡量它的重量,特别是如果它是许多类使用的依赖。
答案 1 :(得分:2)
使用Mockito(我猜其他模拟框架也可以这样做):
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
List<MutableObject> arg = args[0];
MutableObject obj = arg.get(0);
//...
return null;
}})
.when(mock).modifyRequests();
丑陋,你不觉得吗?我强烈建议提取这个匿名内部类并以描述性方式命名。我建议更强大的重构你的代码并简单地返回List<MutableObject> requests
(或者可能返回修改后的副本 - 传递要修改的对象有点笨拙)。
答案 2 :(得分:2)
如果你在嘲笑那个方法,为什么使用该方法的代码需要知道对modifyRequests()
的调用是否改变了什么?
换句话说,您应该能够将此方法模拟为无操作,并且调用它的代码应该仍然具有相同的功能。
否则,调用此方法的代码与方法本身的耦合太紧。