[英]Is there a way with Mockito to run a stubbed method of an spied object from an inner class?
我正在使用 Mockito 為其他人實現的代碼編寫 junit 測試。 簡化:
簡化的代碼可能如下所示:
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
沒有使用Outter
的this
實例,您可能可以使用反射來替換Inner's
對Outter
Inner's
引用。 但是由於Inner
是一個實例內部類(而不是靜態類),並且由於調用getOutterName
使用的是隱式Outter.this
您沒有覆蓋它的機制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.