Mockito:doNothing尝试在Android检测测试中调用void方法

时间:2016-06-22 15:30:39

标签: java android mocking mockito void

修改

在阅读FAQ时,它让我对可能导致问题的原因有所了解。只是尝试一下,我将存根方法的可见性 open()更改为公开,并按预期执行,没有任何异常抛出。

我不确定它是否是版本1.10.19中的错误或所需行为。

原始帖子

在我的Android项目中,我使用Mockito来简化某些(仪器)测试的实现。我能够模拟一些非空方法,但没有想出如何正确地存根空方法

我正在尝试测试课程HouseHouse具有Door类型的属性和方法openDoor()DoorHandle类型的属性以及方法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" 

2 个答案:

答案 0 :(得分:2)

尝试使用较新版本,您使用的是1.10.19。我不确定,但似乎这个问题已经解决了,你可以看到hereHere您可以找到版本列表。

答案 1 :(得分:2)

这可能与Mockito的issue 212有关,其中包私有父类会导致模拟失败,因为Mockito无法隐藏隐藏的方法。 (这可能与编译器引入的synthetic methods相关,以解决类层次结构中的可见性复杂问题。)

Mockito 2.0通过switching from CGLIB to ByteBuddy解决了这个问题;我不记得ByteBuddy是否是任何1.x版本的一部分。但是,您正在使用Mockito和DexMaker,这可能会遇到类似的问题。