当前位置: 首页 > 知识库问答 >
问题:

Mockito:doNothing试图在Android instrumented test中调用void方法

皇甫卓君
2023-03-14

编辑

在阅读FAQ时,它让我了解了可能导致问题的原因。为了尝试一下,我将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
   }
}

问题是,一个NullPointerExc0019被抛出在行doNothing.when(ustbedDoor). open();,告诉我句柄是null. doNo()似乎实际上调用open(),这我不指望。

有人知道这个问题的根源吗?我是新来的,所以我可能错过了一些明显的东西。

为了在仪器测试中启用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个答案

司马钱明
2023-03-14

这可能与Mockito的问题212有关,在该问题中,包私有父类可能会导致Mockito失败,因为Mockito无法存根隐藏的方法。(这可能与编译器为解决类层次结构中的可见性复杂性而引入的合成方法有关。)

Mockito 2.0通过从CGLIB切换到ByteBuddy来解决这个问题;我不记得ByteBuddy是否是任何1. x版本的一部分。但是,您将Mockito与DexMaker一起使用,这可能会有类似的问题。

萧永望
2023-03-14

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

 类似资料: