如何模拟依赖于更新可变对象的方法

时间:2011-10-17 19:46:00

标签: java unit-testing mocking

我有一个不返回值的方法。它接受一个列表并修改该列表的成员。显然,列表本身是可变的,其成员也是如此。

EG:我想嘲笑这个:

    void modifyRequests(List<MutableObject> requests);

3 个答案:

答案 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()的调用是否改变了什么?

换句话说,您应该能够将此方法模拟为无操作,并且调用它的代码应该仍然具有相同的功能。

否则,调用此方法的代码与方法本身的耦合太紧。