2016-07-15 112 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 **? –

相關問題