2016-07-15 83 views
2

在执行单元测试期间,该方法被调用3次。每次调用不同的参数。我想验证一下,在最后一次调用相应参数的方法。Mockito,如何验证上次调用方法的参数

请帮帮我。

我的方法:

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 3倍。它应该仅在上次被调用。

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

回答

1

我认为你可以用ArgumentCaptor来达到这个目的。 使用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)); 
+0

感谢。那是我需要的。 –

+0

什么是** expectedBetSyncObj **? –

相关问题