我有一个很长的方法,看起来像这样:
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来捕获传递给方法的参数。我现在能做什么?
答案 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)