Java Mockito:无法返回子类



当我尝试模拟一个方法时,我得到了一个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();

更完整的答案需要更完整的问题;)

相关内容

  • 没有找到相关文章

最新更新