Java Mockito:不能做回归儿童班吗?

时间:2015-04-15 23:42:04

标签: java unit-testing 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中,我可以从返回类型为B的方法中多态返回C的实例,因为B实现了C。但是,似乎doReturn无法返回实现原始返回类型的子类的实例。

我希望我理解这一点,但是我做错了什么还是有解决方法呢?

2 个答案:

答案 0 :(得分:1)

啊,我是个白痴。结果我试图模拟的方法是最终的,我最初没有注意到。这是来自一个超级班,我认为它不是最终的。最终的方法不能被覆盖,Mockito不能嘲笑它们。

以下是一个更好的例子:

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();

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