用构建器模式替换带有长参数列表的方法。如何用Mockito测试?

时间:2017-07-20 12:03:00

标签: java unit-testing oop testing mockito

我有一个很长的方法,看起来像这样:

public class Executor {
   public void do(int a, int b, C c, D d, int e, int f);
}

我用构建器模式替换了这个方法,现在调用方法如下:

executor.do(a).withB(b).withC(c).withD(d).withE(e).withF(f);

以前,我使用Mockito测试了我的方法:

verify(mockExecutor).do(anyInt(), anyInt(), eq(c), eq(d), anyInt(), anyInt());

但是,我现在可以这样做。而且我也不能使用ArgumentCaptor来捕获传递给方法的参数。我现在能做什么?

1 个答案:

答案 0 :(得分:0)

使用您提供的示例,很难(但可能)验证mockExecutor是否已调用所有方法,因为您必须立即模拟所有方法并确保它们都返回您的模拟对象。

Executor executor = mock(Executor.class);
when(executor.do(anyInt())).thenReturn(executor);
when(executor.withB(anyInt())).thenReturn(executor);
...
when(executor.withF(anyInt())).thenReturn(executor);

所以你可以验证所有这些方法都被调用。

verify(executor).do(anyInt())
...
verify(executor).withF(anyInt())

但这看起来不是一个很好的解决方案。 我建议稍微重构你的代码,将Executor逻辑与数据分开(让我们称之为ExecutorContext),比如

ExecutorContext context = ExecutorContext.builder().withA(a).withB(b).withC(c).withD(d).withE(e).withF(f);

executor.do(context)

因此,在测试中,您可以使用

轻松验证执行者
verify(mockExecutor).do(any(ExecutorContext.class)) 

或使用特定的ExecutorContext(但不要忘记在那里实现equals)