2017-04-19 140 views
1

我處於需要使用PowerMocklito模擬兩種靜態方法的情況。它爲第一行代碼提供了一個模擬對象,但是之後再次調用同一個方法,但是這次它返回一個不同的對象,並且這會引發ClassCastException如何使用Mockito/PowerMockito解決ClassCastException

方法在測試

ESignatureJaxBContextFactory context = (ESignatureJaxBContextFactory) AppContext.getBean("jaxbContextFactory"); 
/// More code 
DocusignRESTClient client = (DocusignRESTClient) AppContext.getBean("restServiceClient"); 

Junit的

private ESignatureJaxBContextFactory eSignatureJaxBContextFactory; 
eSignatureJaxBContextFactory = mock(ESignatureJaxBContextFactory.class); 

PowerMockito.when(AppContext.getBean(any(String.class))).thenReturn(eSignatureJaxBContextFactory); 

所以上面的代碼行返回我的模擬情境,但我得到一個異常時,它試圖獲取客戶端。我如何測試這個?

在此先感謝

回答

1

的問題是,你在嘲諷AppContext.getBeanany(String.class) 試試這個:

PowerMockito.when(AppContext.getBean("jaxbContextFactory")) 
      .thenReturn(eSignatureJaxBContextFactory); 
PowerMockito.when(AppContext.getBean("restServiceClient")) 
      .thenReturn(docusignRESTClient); 

在這種情況下,當AppContext.getBean與參數"jaxbContextFactory"調用它會返回eSignatureJaxBContextFactory,但沒有任何其他參數。所以你也需要用參數"restServiceClient"來模擬調用。

測試它是提供一組連續的返回值的其他方式:

PowerMockito.when(AppContext.getBean(any(String.class))) 
      .thenReturn(eSignatureJaxBContextFactory, docusignRESTClient); 

在這種情況下,你仍然嘲笑的AppContext.getBean任何調用任意字符串值作爲參數,但都在講的Mockito返回eSignatureJaxBContextFactory在第一次調用時返回docusignRESTClient並且返回任何進一步的調用。

+0

這兩種解決方案都適合我。您的解決方案非常合理且簡單。非常感謝。 – Mike

相關問題