Mockito:在另一个方法中模拟一个方法调用

Mah*_*yar 1 java junit mocking mockito

所以我试图模拟另一个方法中的方法调用,这是伪代码

class A{

    public String getAName(String id){
        B b = new B();
        // do something
        return b.getBName(id);
    }
}

testgetName{

    public void testA(){

        B mockB = mock(B.class);        
        Mockito.doReturn("Bar").when(mockB).getBName(id);

        A a = new A();
        a.getAName(id); //this still calls "b.getBName(id)" in class implementation
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的问题a.getAName仍然是电话 b.getBName(id)——不知道为什么?

关于我应该如何b.getBName(id)正确模拟的任何建议

谢谢

Bik*_*wal 6

因为您没有在 A 类中注入/使用模拟对象。在 A 类中,您正在创建一个新的 B 对象。因此,永远不会使用模拟对象。要解决此问题,请将 A 类实现更改为以下内容:

B 作为班级成员:

class A{
  B b;

  public String getAName(String id){

    // do something
    return b.getBName(id);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的测试方法中将模拟对象注入类 A 中的 B 成员。见下文:

public void testA()(){
    B mockB = mock(B.class);
    Mockito.doReturn("Bar").when(mockB).getBName(id);
    A a = new A();
    a.b = mockB; //add this line to use mock in A
    String testStr = a.getAName(id); //this still calls "b.getBName(id)" in class implementation
    System.out.println(testStr);

}
Run Code Online (Sandbox Code Playgroud)