簡體   English   中英

Mockito 中的 InvocationTargetException

[英]InvocationTargetException in Mockito

我在我的測試用例中收到 InvocationTarget Exception。 這是我要測試的課程:

public class UpdateHandler implements Handler {
 public void process(UE m, UEC u) {
  try {
   Info info = facade1.queryInfo(string).getInfo();
   Index index = facade2.findindex(string2);
   if(facade3.isWhitelisted() {
    facade2.update(info, index);
   }
  } catch(UpdateException e) {
    //log
  }
}

這是我的測試文件

public class TestFile {
 @Mock
 protected Facade1 facade1;

 @Mock
 protected Facade2 facade2;

 @Mock
 protected Facade3 facade3;

 private Info info;
 private Index index;

 @InjectMocks 
 private UpdateHandler updatehandler;

 @BeforeMethod
 public void beforeTest() {
        MockitoAnnotations.initMocks(this);
    }

 @Test
 public void Test1() {
  info = getInfo();
  index = getIndex();
  updateHandler.process(UEprepare(), null);
  Mockito.when(facade1.queryInfo(Mockito.anyString()).getInfo()).thenReturn(getInfo());
  Mockito.when(facade2.findindex(Mockito.anyString()).thenReturn(getIndex());
  Mockito.when(facade3.isWhitelisted()).thenReturn(true);
  Mockito.verify(facade1, Mockito.times(1).update(info, index);
 }
}

getInfo() 和 getIndex() 是我在測試文件中創建的兩個方法,只是為了創建 Info 和 Index 的示例對象。 UEprepare是一種准備UE樣本對象的方法。 UM 可以為空。 我已經檢查過這不是問題。

我得到的錯誤是空指針異常。 具體來說,facade1.queryInfo(string) 的值為空。 它應該是一個 InfoResult 類型的對象,我可以從中提取一個 Info 對象。 我檢查了 queryInfo 方法,它不會在任何地方拋出 NPE。 它只拋出 UpdateException 類型的異常,我已經在 try catch 中的代碼中處理了該異常。

當我深入挖掘時,我發現了一個 InvocationTargetException。 我無法具體了解該異常的來源,但我認為它與 queryInfo 方法有關。

我已經為我正在使用的所有門面初始化了模擬,我想我也正確地使用了 InjectMocks,所以我被困在如何調試這個問題上。

您的代碼中有兩個錯誤:

方法順序

你有:

  • 被測方法的調用
  • 設定期望Mockito.when
  • 預期驗證Mockito.verify

雖然應該是

  • 設定期望Mockito.when
  • 被測方法的調用
  • 預期驗證Mockito.verify

連鎖預期

Mockito.when(facade1.queryInfo(Mockito.anyString()).getInfo()).thenReturn(getInfo());

您需要額外的模擬來獲取queryInfo調用的結果,比如說@Mock QueryInfo queryInfo 然后,您需要 2 次調用來設置此期望:

Mockito.when(facade1.queryInfo(Mockito.anyString()).thenReturn(queryInfo);
Mockito.when(queryInfo.getInfo()).thenReturn(getInfo());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM