簡體   English   中英

Java Mockito:不能返回子類嗎?

[英]Java Mockito: Cannot doReturn child classes?

嘗試模擬方法時,出現UnfinishedStubbingException 我試圖讓doReturn返回實現特定接口的類的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()並使其返回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無法返回實現原始返回類型的子類的實例。

我希望我理解這是正確的,但是我做錯了什么嗎?還是可以解決這個問題?

啊,我是個白痴。 原來我嘗試模擬的方法是最終的,而我最初並沒有注意到。 它來自超級班級,我認為那不是最終的。 final方法不能被覆蓋,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();

更完整的答案需要更完整的問題;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM