簡體   English   中英

Mockito:doNothing嘗試在Android檢測測試中調用void方法

[英]Mockito : doNothing tries to invoke the void method in Android instrumented test

編輯

閱讀常見問題時 ,它讓我對可能導致問題的原因有所了解。 只是嘗試一下,我將stubbed方法 open()可見性更改為public ,並按預期執行,沒有任何異常拋出。

我不確定這是一個錯誤還是版本1.10.19所需的行為。

原始郵政

在我的Android項目中,我使用Mockito來簡化某些(儀器)測試的實現。 我能夠模擬一些非void方法,但沒有弄清楚如何正確地存根void方法

我正試圖測試一個班級的House House具有類型為Door的屬性和方法openDoor() 一個Door和一個Handle類型的屬性和一個方法open() 當我調用openDoor() ,我想檢查open()被調用,所以我寫了這段代碼:

@Test
public void testOpenDoorInitial() {
    Door stubbedDoor = mock(Door.class);
    doNothing().when(stubbedDoor).open();
    myHouse.setDoor(stubbedDoor); //myHouse has been initialized
    myHouse.openDoor();
    verify(stubbedDoor, times(1)).open();
}

public class House {
   Door door;
   //rest of code       
   void setDoor(Door d){
      door = d;
   }
   void openDoor(){
      // some conditions
      door.open();
   }
}

public class Door {
   Handle handle;
   //... rest of code
   void open(){
      handle.tryToUse(); //Throws NullPointException
   }
}

問題是在doNothing.when(stubbedDoor).open();行上拋出NullPointerException doNothing.when(stubbedDoor).open(); 告訴我handle為空。 doNothing()似乎實際上調用open() ,這是我不期望的。

有沒有人對這個問題的根源有所了解? 我是Mockito的新手,所以我可能錯過了一些明顯的東西。

為了在儀器測試中啟用Mockito,我導入了以下模塊。

androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile "com.crittercism.dexmaker:dexmaker:1.4"
androidTestCompile "com.crittercism.dexmaker:dexmaker-dx:1.4"
androidTestCompile "com.crittercism.dexmaker:dexmaker-mockito:1.4" 

嘗試使用較新的版本,您使用的是1.10.19。 我不確定,但似乎這個問題已經解決了,正如你在這里看到的那樣。 在這里您可以找到版本列表。

這可能與Mockito的問題212有關 ,其中包私有父類可能導致模擬失敗,因為Mockito無法存根隱藏的方法。 (這可能與編譯器引入的合成方法有關,可以解決類層次結構中的可見性復雜問題。)

Mockito 2.0通過從CGLIB切換到ByteBuddy解決了這個問題; 我不記得ByteBuddy是否是任何1.x版本的一部分。 但是,你正在使用Mockito和DexMaker,這可能有類似的問題。

暫無
暫無

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

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