Java Mockito:无法返回 child 类?

Java Mockito: Cannot doReturn child classes?

当我尝试模拟一个方法时,我得到了一个 UnfinishedStubbingException。我正在尝试让 doReturn return 成为实现特定接口的 class 的模拟实例。该接口是被模拟方法的原始 return 类型。

这里有一个 class 结构的例子:

class A { 
    private C obj;

    C getObj() {
        return obj;
    }
}

class B implements C {
    void doCStuff() {}
    void doBStuff() {}
}

interface C {
    void doCStuff();
}

使用此结构,我试图 mock A.getObj() 并使其 return 成为 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 return 成为 B 的模拟实例,但我做不到。通常在 Java 中,我可以从具有 return 类型 C 的方法中多态 return B 的实例,因为 B 实现C。但是,似乎 doReturn 不能 return 实现原始 return 类型的 child class 实例。

我希望我的理解是正确的,但是我做错了什么或者有解决办法吗?

不确定这是否有效;缺少代码来判断这是否可以解决问题,但也许您可以试试这个:

final C c = spy(new B());

final A a = spy(new A());

doReturn(c).when(a).getObj();

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

啊,我是个白痴。原来我试图模拟的方法是最终的,我最初没有注意到。它来自超级 class,我认为它不是最终版本。 final 方法不能被覆盖,Mockito 不能模拟它们。

这是一个更好的例子:

class A extends D {
    ...
}

class D {
    //Can't mock this.
    final Object getObj() { ... }
}

事实证明,您仍然可以通过 Mockito 多态 return 对象,所以虚惊一场。