如何使用ArgumentCaptor进行存根?

Can*_*ell 156 java junit unit-testing mockito

在Mockito 文档javadocs中

建议使用ArgumentCaptor进行验证,但不使用stubbing.

但我不明白ArgumentCaptor如何用于存根.有人可以解释上面的陈述,并说明ArgumentCaptor如何用于存根或提供一个链接,说明如何做到这一点?

Ror*_*ick 265

假设要测试以下方法:

public boolean doSomething(SomeClass arg);
Run Code Online (Sandbox Code Playgroud)

文档的Mockito说,你应该以这种方式使用的捕手:

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));
Run Code Online (Sandbox Code Playgroud)

因为您可以在存根期间使用匹配器:

when(someObject.doSomething(eq(expected))).thenReturn(true);
Run Code Online (Sandbox Code Playgroud)

但验证是另一回事.如果您的测试需要确保使用特定参数调用此方法,请使用ArgumentCaptor以及设计它的情况:

ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));
Run Code Online (Sandbox Code Playgroud)

  • 不确定"不使用茬"的原因是一个简单的原因.匹配器不会给我们实际预期的参数(只是类型),并且尽管参数可能是错误的,但仍然可以通过测试. (3认同)