Mockito 在"recording"时捕获参数,并在稍后执行时使用它



我有以下代码要测试:

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 的状态。

相关内容

  • 没有找到相关文章

最新更新