2014-03-25 65 views
2

我正在使用Mockito編寫由其他人實現的代碼的junit測試。 簡化:有沒有一種方法可以讓Mockito從內部類運行窺探對象的殘留方法?

  • 有一個外部類和內部類
  • 外類保持內部類的一個實例。
  • 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";  
     } 
    } 
} 

我想存根外類的方法getOuterName()返回方便我的測試值。 要做到這一點,我在對象上「間諜」:

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

現在,如果我叫:

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

的存根方法被調用,在這兩個電話,我得到的字符串:「 outerspied」 和 「NAME = outerspied」

但是如果我打電話:

spyOuter.getInner().getInnerName(); 

在這種情況下,不會調用stubbed方法,而是最初的方法。我期望「外部內部」,但得到「外部內部」

總結,在窺探的外部對象中,引用「this」指向窺探的實例。 但是對於內部對象來說,對「Outer.this」的引用指向了「不可見」實例。

我不知道我是否做錯了什麼,它是一個錯誤,或者它按照設計工作;問題是:是否有解決方法?

提前

+0

它按照這裏所設計的工作;代理人是你的間諜,但是「內在」並不知道那個間諜。 – fge

回答

2

spy非常感謝僅包圍與代理的窺探對象。它沒有任何機制來取代偵察對象內的呼叫。所以即使一個方法通過間諜存留,如果間諜對象直接調用該方法,被調用的間諜對象的方法不是間諜的存根。這基本上就是您的Inner/Outter的情況。如果Inner未使用thisOutter實例,則可能可以使用反射來替換Inner'sOutter的引用。但由於Inner是一個實例內部類(而不是靜態),並且由於getOutterName的調用使用隱含的Outter.this,所以您沒有機制來覆蓋此類。

相關問題