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上测试调用