Unit testing Mockito,如何在上次调用该方法时验证该方法的参数

Unit testing Mockito,如何在上次调用该方法时验证该方法的参数,unit-testing,mockito,Unit Testing,Mockito,在执行单元测试期间,该方法被调用3次。每次调用时都使用不同的参数。我想验证一下,上次调用方法时是否使用了相应的参数 请帮帮我 我的方法: private void doHandle(Updategram updategram) throws FixtureNotFoundException, DatatypeConfigurationException { BetSyncObject betSyncObject = transformer.transformer(update

在执行单元测试期间,该方法被调用3次。每次调用时都使用不同的参数。我想验证一下,上次调用方法时是否使用了相应的参数

请帮帮我

我的方法:

private void doHandle(Updategram updategram)
      throws FixtureNotFoundException, DatatypeConfigurationException {
    BetSyncObject betSyncObject = transformer.transformer(updategram);
    EventTreeCreation event = betSyncObject.eventTree;
    if (!event.getEvent().isEmpty()) {
      Event event2 = event.getEvent().get(0);
      long timestamp =
          updategram.getHeader().getTimeStampUtc().toGregorianCalendar().getTimeInMillis();
      String sportName = event2.getSportcode();
      String id = event2.getExtId();
      publisher.publishEvent(PROVIDER_NAME, betSyncObject, sportName, id, timestamp);
    } else {
      LOGGER.info("Empty event tree : {}", betSyncObject);
    }
  }
测试:

 @Test
    public void testCountAndSetResultLine() throws Exception{
        EventPublisher eventPublisher = Mockito.mock(EventPublisher.class);
        BetgeniusService betgeniusService = new BetgeniusService();

        BetSyncObject expectedBetSyncObj = transformer.transformer(updategram);

        ExecutorService service = Executors.newFixedThreadPool(3);
        handle(betgeniusService, updategramFixture, service);
        Thread.sleep(50);
        handle(betgeniusService, updategramMarketSet, service);
        Thread.sleep(50);
        handle(betgeniusService, updategramResult, service);

        service.shutdown();
        service.awaitTermination(20000, TimeUnit.MILLISECONDS);
        betgeniusService.getExecutor().shutdown();
        betgeniusService.getExecutor().awaitTermination(20000, TimeUnit.MILLISECONDS);

        Mockito.verify(eventPublisher, Mockito.times(3)).publishEvent(Mockito.anyString(), Mockito.any(BetSyncObject.class),
                Mockito.anyString(), Mockito.anyString(), Mockito.anyLong());

    }
此时我遇到了一个异常,因为
publishEvent
方法没有使用
expectedBetSyncObj
调用三次。最后一次应该用它来调用它


因此,请告诉我如何检查上次使用
expectedBetSyncObj
对象调用了
PublisheEvent
方法

我想你可以通过一个。 使用ArgumentCaptor获取所有调用的参数,然后稍后验证每个调用。 在本例中,您将验证在第三次调用时参数(
.get(2)
)是否是预期的对象

大概是

ArgumentCaptor<BetSyncObject> betSyncObjectCaptor = ArgumentCaptor.forClass(BetSyncObject.class);
Mockito.verify(eventPublisher, Mockito.times(3)).publishEvent(Mockito.anyString(), betSyncObjectCaptor.capture(), Mockito.anyString(), Mockito.anyString(), Mockito.anyLong());

List<BetSyncObject> capturedBetSyncObject = betSyncObjectCaptor.getAllValues();
assertEquals(expectedBetSyncObj, capturedBetSyncObject.get(2));
ArgumentCaptor betSyncObjectCaptor=ArgumentCaptor.forClass(BetSyncObject.class);
Mockito.verify(eventPublisher,Mockito.times(3)).publishEvent(Mockito.anyString(),betSyncObjectCaptor.capture(),Mockito.anyString(),Mockito.anyString(),Mockito.anyLong());
List capturedBetSyncObject=betSyncObjectCaptor.getAllValues();
assertEquals(expectedBetSyncObj,capturedBetSyncObject.get(2));

谢谢。这就是我所需要的。什么是预期的?