我创建了以下
Answer实现:
public class CapturingAnswer<T, R> implements Answer<T> { private final Function<InvocationOnMock, R> capturingFunction; private final List<R> capturedValues = new ArrayList<R>(); public CapturingAnswer(final Function<InvocationOnMock, R> capturingFunction) { super(); this.capturingFunction = capturingFunction; } @Override public T answer(final InvocationOnMock invocation) throws Throwable { capturedValues.add(capturingFunction.apply(invocation)); return null; } public List<R> getCapturedValues() { return Collections.unmodifiableList(capturedValues); }}此答案捕获正在进行的调用的属性。然后
capturedValues可以将其用于简单的断言。该实现使用Java 8
API。如果那不可用,则需要使用能够将转换
InvocationOnMock为捕获值的接口。测试用例中的用法是这样的:
@Testpublic void testSomething() { CapturingAnswer<Void,Date> captureDates = new CapturingAnswer<>(this::getEntityDate) Mockito.doAnswer(captureDates).when(persistence).save(Mockito.any(Entity.class)); service.foo(); Assert.assertNull(captureDates.getCapturedValues().get(0));}private Date getEntityDate(InvocationOnMock invocation) { Entity entity = (Entity)invocation.getArguments()[0]; return entity.getDate();}Answer通过Mockitos无法实现由所实现的捕获,
ArgumentCaptor因为这仅在调用被测方法之后使用。



