Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito:在另一个方法中模拟方法调用_Java_Junit_Mocking_Mockito - Fatal编程技术网

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

Java Mockito:在另一个方法中模拟方法调用,java,junit,mocking,mockito,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);

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

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
    }

}
这里的问题是
a.getAName
仍然调用
b.getBName(id)
-不知道为什么

关于如何正确模拟
b.getBName(id)
有什么建议吗


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

B作为班级成员:

class A{
  B b;

  public String getAName(String id){

    // do something
    return b.getBName(id);
  }
}
然后在您的测试方法中,将模拟对象注入类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);

}

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

B作为班级成员:

class A{
  B b;

  public String getAName(String id){

    // do something
    return b.getBName(id);
  }
}
然后在您的测试方法中,将模拟对象注入类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);

}

您不能用
new
模拟被测对象创建的对象,因为您无法控制这些对象。您必须将
B
设置为类
a
的字段,然后在测试期间注入它。这就是人们喜欢依赖注入的原因之一:)有一个建议,您的代码中有一条注释,内容是
//做点什么
。如果这是一个需要B的方法调用,我会模拟这个方法,或者更好,使用arumingcaptor来捕获传递给该方法的
B
。这一切都取决于
//实际做什么
您不能用
new
模拟受测对象创建的对象,因为您无法控制这些对象。您必须将
B
设置为类
a
的字段,然后在测试期间注入它。这就是人们喜欢依赖注入的原因之一:)有一个建议,您的代码中有一条注释,内容是
//做点什么
。如果这是一个需要B的方法调用,我会模拟这个方法,或者更好,使用arumingcaptor来捕获传递给该方法的
B
。这一切都取决于
//实际做什么