当我尝试模拟方法时,我得到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中,我可以从返回类型为B
的方法中多态返回C
的实例,因为B
实现了C
。但是,似乎doReturn
无法返回实现原始返回类型的子类的实例。
我希望我理解这一点,但是我做错了什么还是有解决方法呢?
答案 0 :(得分:1)
以下是一个更好的例子:
class A extends D {
...
}
class D {
//Can't mock this.
final Object getObj() { ... }
}
事实证明你仍然可以通过Mockito多态返回对象,因此误报。
答案 1 :(得分:0)
不确定这是否有效;代码缺乏判断这是否可以解决问题,但也许你可以试试这个:
final C c = spy(new B());
final A a = spy(new A());
doReturn(c).when(a).getObj();
更完整的答案需要更完整的问题;)