[英]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"
這可能與Mockito的問題212有關 ,其中包私有父類可能導致模擬失敗,因為Mockito無法存根隱藏的方法。 (這可能與編譯器引入的合成方法有關,可以解決類層次結構中的可見性復雜問題。)
Mockito 2.0通過從CGLIB切換到ByteBuddy解決了這個問題; 我不記得ByteBuddy是否是任何1.x版本的一部分。 但是,你正在使用Mockito和DexMaker,這可能有類似的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.