我有以下代码要测试:
pojo.setStatus(Status.INITIAL);
pojo.setExecutionCounter(0);
//eventRepository is a mock
scheduleEvent(this.eventRepository.save(pojo).get());
在单元测试中,我想验证
- POJO已相应修改
- 将安排的事件具有状态
INITIAL
,计数器0
- 保存模拟已被调用
不幸的是,我不知道该怎么做,因为我必须返回我必须capture
的论点。当我展示我的单元测试示例时,也许它变得更加清晰:
succeededEvent.setEventStatus(INITIAL);
succeededEvent.setExecutionCounter(0);
//Actually we want here to return the argument
//which is captured by eventArgumentCaptor??
when(this.eventRepository.save(this.eventArgumentCaptor.capture()))
.thenReturn(succededEvent);
this.processor.processEvent(initialEvent);
Mockito.verify(this.eventRepository,
Mockito.times(1)).save(eventCaptureExecuteCaptor.capture());
final Event capturedEvent = eventCaptureExecuteCaptor.getValue();
//Counter and status should be reset
assertEquals(new Integer(0), capturedEvent.getExecutionCounter());
assertEquals(INITIAL, capturedEvent.getEventStatus());
verify(this.eventRepository,
times(1)).save(eq(eventCaptureExecuteCaptor.getValue()));
不知道为什么在存根时使用捕获器。您可以按照设计在调用 SUT 后使用它:
this.processor.processEvent(initialEvent);
Mockito.verify(this.eventRepository,
Mockito.times(1)).save(eventCaptureExecuteCaptor.capture());
在存根时,您可以直接选择预期的具体对象:
when(this.eventRepository.save(succededEvent)
.thenReturn(succededEvent);
或者,如果您在设置时手头没有该对象,请使用通用输入:
when(this.eventRepository.save(anyClass(EventPojo.class))
.thenReturn(succededEvent);
编辑:
您还可以使用该thenAnswer
以及接受任何 Pojo 类型的输入类:
when(this.eventRepository.save(Mockito.any(EventPojo.class))
.thenAnswer(new Answer<EventPojo>(){
EventPojo pojo = invocation.getArgument(0);
return pojo;
}
);
由于这是一个匿名实现,因此如果需要,您可以捕获传递的 POJO 的状态。