簡體   English   中英

Mockito 有沒有辦法從內部類運行被監視對象的存根方法?

[英]Is there a way with Mockito to run a stubbed method of an spied object from an inner class?

我正在使用 Mockito 為其他人實現的代碼編寫 junit 測試。 簡化:

  • 有一個外部類和一​​個內部類
  • Outer 類保留了一個 Inner 類的實例。
  • Inner 類使用 Outer 類的方法。

簡化的代碼可能如下所示:

public class Outer {
    private Inner inner;

    public Outer(){
         inner=new Inner();
    }

    public Inner getInner(){
        return inner;
    }

    public String getOuterName(){
        return "outer";
    }

    public String getOuterNiceName(){
        return "name="+getOuterName();
    }

    public class Inner {
        public String getInnerName(){
            return getOuterName()+"-inner";     
        }
    }
}

我想存根 Outer 類的方法 getOuterName() 返回一個方便我的測試的值。 為此,我正在“監視”對象:

Outer outer=new Outer();
Outer spyOuter=spy(outer);
doReturn("outerspied").when(spyOuter).getOuterName();

現在,如果我打電話:

spyOuter.getObjectName(); 
spyOuter.getOuterNiceName(); 

在兩個調用中都調用了存根方法,我得到了字符串:“outerspied”和“name=outerspied”

但是,如果我打電話:

spyOuter.getInner().getInnerName(); 

在這種情況下,不會調用存根方法,而是調用原始方法。 我期待“外層內部”,但得到了“外部內部”

總而言之,在被監視的外部對象中,引用“this”指向被監視的實例。 但是對於內部對象,對“Outer.this”的引用指向一個“非間諜”實例。

我不知道是我做錯了什么,是一個錯誤,還是按設計工作; 問題是:有解決方法嗎?

提前謝謝了

I spy只用代理包圍被監視的對象。 它沒有任何機制來替換被監視對象內的調用。 因此,即使一個方法是通過間諜存根的,如果被監視對象直接調用該方法,則被監視對象的方法將被調用而不是間諜的存根。 這基本上就是你的Inner / Outter正在發生的Outter 如果Inner沒有使用Outterthis實例,您可能可以使用反射來替換Inner'sOutter Inner's引用。 但是由於Inner是一個實例內部類(而不是靜態類),並且由於調用getOutterName使用的是隱式Outter.this您沒有覆蓋它的機制。

暫無
暫無

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

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