当我尝试模拟一个方法时,我得到了一个UnfinishedStubbingException
。我正在尝试让doReturn
返回实现特定接口的类的模拟实例。 该接口是被模拟方法的原始返回类型。
下面是类结构的示例:
class A {
private C obj;
C getObj() {
return obj;
}
}
class B implements C {
void doCStuff() {}
void doBStuff() {}
}
interface C {
void doCStuff();
}
使用此结构,我正在尝试mock A.getObj()
并让它返回一个模拟的B
实例。
public void test() {
A aObj = Mockito.mock(A.class);
B bObj = Mockito.mock(B.class);
Mockito.doReturn(bObj).when(aObj).getObj(); //throws UnfinishedStubbingException
//Edit:
B newB = (B)aObj.getObj();
newB.doBStuff();
}
问题是,我需要getObj
返回一个模拟的B
实例,但我不能。 通常在Java中,我可以从返回类型为C
的方法多态地返回B
实例,因为B
实现了C
。但是,似乎doReturn
无法返回实现原始返回类型的子类的实例。
我希望我理解正确,但我做错了什么还是有解决方法?
啊,我是个白痴。 事实证明,我试图模拟的方法是最终的,我最初没有注意到这一点。 它来自一个超级班级,我认为它不是最终的。 最终的方法不能被覆盖,Mockito也不能模拟它们。
下面是一个更好的示例:
class A extends D {
...
}
class D {
//Can't mock this.
final Object getObj() { ... }
}
事实证明,您仍然可以通过 Mockito 多态返回对象,因此对此发出误报。
不确定这是否有效;缺乏代码来判断这是否可以解决问题,但也许您可以尝试一下:
final C c = spy(new B());
final A a = spy(new A());
doReturn(c).when(a).getObj();
更完整的答案需要更完整的问题;)