修改
在阅读FAQ时,它让我对可能导致问题的原因有所了解。只是尝试一下,我将存根方法的可见性 open()
更改为公开,并按预期执行,没有任何异常抛出。
我不确定它是否是版本1.10.19中的错误或所需行为。
原始帖子
在我的Android项目中,我使用Mockito来简化某些(仪器)测试的实现。我能够模拟一些非空方法,但没有想出如何正确地存根空方法。
我正在尝试测试课程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
}
}
问题是在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"
答案 0 :(得分:2)
答案 1 :(得分:2)
这可能与Mockito的issue 212有关,其中包私有父类会导致模拟失败,因为Mockito无法隐藏隐藏的方法。 (这可能与编译器引入的synthetic methods相关,以解决类层次结构中的可见性复杂问题。)
Mockito 2.0通过switching from CGLIB to ByteBuddy解决了这个问题;我不记得ByteBuddy是否是任何1.x版本的一部分。但是,您正在使用Mockito和DexMaker,这可能会遇到类似的问题。