Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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_Mockito_Verify - Fatal编程技术网

Java Mockito-如何验证由间接私有字段对象进行的方法调用

Java Mockito-如何验证由间接私有字段对象进行的方法调用,java,mockito,verify,Java,Mockito,Verify,我正在尝试验证由间接私有字段对象进行的方法调用。比如说 要测试的代码: class A { final private B b; public A(C c, D d) { this.b = new B(c,d); } public void methodToTest() { b.wantToVerifyThisIsCalled(); } } class B { private C c;

我正在尝试验证由间接私有字段对象进行的方法调用。比如说

要测试的代码:

class A
{
    final private B b;
    public A(C c, D d)
    {
        this.b = new B(c,d);   
    }

    public void methodToTest()
    {
        b.wantToVerifyThisIsCalled();
    }
}

class B
{
   private C c;
   private D d;

   public B(C c, D d)
   {
      this.c = c; 
      this.d = d;
   }
   ...
   public void wantToVerifyThisIsCalled()
   {
       //do stuff 
       return;
   }
}
我想验证在运行A.methodToTest()时是否调用了b.WantToVerifyThisCalled()方法

我尝试过类似的方法,但不起作用:

C c = mock(C.class);
D d = mock(D.class); 
A a = new A(C,D);
B b = moc(B.class);

a.methodToTest();
verify(b).wantToVerifyThisIsCalled();  \\<-- This gives me error, wanted but not invoked
C=mock(C.class);
D=模拟(D类);
A=新的A(C,D);
B=主运行中心(B级);
a、 方法测试();

验证(b).是否要验证此调用()\\ 发生这种情况是因为调用了
wanttoverifythisalled()
方法的
B
类对象不是模拟对象。您应该将模拟对象注入
A

如果您的
A
类构造函数直接获取
B
实例,而不是
C
D
,并依赖它来创建
B
类对象,这会更好

尝试修改您的类,如下所示:

class A {
    private final B b;
    public A(B b) { this.b = b; }

    public void methodToTest() {
        b.wantToVerifyThisIsCalled();
    }
}

class B {
    private final C c;
    private final D d;
    public B(C c, D d) { this.c = c; this.d = d; }

    public void wantToVerifyThisIsCalled() { ... }
}
然后像这样测试它:

C c = mock(C.class);
D d = mock(D.class); 
B b = mock(B.class);// Find a way to set private fields (May be provide setters).
A a = new A(b);

a.methodToTest();
verify(b).wantToVerifyThisIsCalled();

在这种情况下,B的使用是一个私有的实现细节,不应该进行测试。相反,在C和D上测试调用