我正在尝试验证由间接私有(private)字段对象进行的方法调用。例如
要测试的代码:
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.wantToVerifyThisIsCalled() 方法;
我尝试过类似的方法,但这不起作用:
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
我应该如何验证类 A 的这个 b 字段对象确实在进行该方法调用?
遗憾的是没有 setter 方法,字段对象也被标记为 final :(
谢谢
最佳答案
发生这种情况是因为调用 wantToVerifyThisIsCalled()
方法的 B
类对象不是您的模拟对象。您应该将模拟对象注入(inject) 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();
关于java - Mockito - 如何验证间接私有(private)字段对象进行的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24598704/