2017-08-22 35 views
0

我的類看起來是這樣的:如何存根複雜對象的方法作爲參數的Mockito

public class MyClass{ 
     A obj; 
     List<B> Obj1; 
     } 
    public class A{ 
    C obj2; 
    } 
    public class B{ 
     List values; 
    } 

中有如下MyClassImpl類中的方法addToCart()

  class MyClassImpl{ 
       addToCart(MyClass c, String x, String Y, String Z); 

     } 

我寫一個測試類到MyClassImpl。我能夠將x,y和z的測試值傳遞給addToCart(),但由於c是一個複雜的對象,因此如何爲這個方法存儲值?更深入地設定值是需要時間的。

回答

1

如果測試不依賴於MyClass填充的情況下被傳遞到addToCart()那麼你可以嘲笑它...

MyClass myClass = Mockito.mock(MyClass.class); 
String x = "some x"; 
String y = "some y"; 
String y = "some z"; 

MyClassImpl sut = new MyClassImpl(); 
sut.addToCart(myClass, x, y, z); 

// continue with test assertions ... 

這將工作,只要你的addToCart()使用不關心內容或行爲myClass

但是,如果您的測試用法addToCart()myClass的內容或行爲有一些期望,那麼您必須傳遞一個實際的「MyClass」實例,以滿足這些期望。 「設置值更深的」非常耗時,而且,也許,你的測試只關心的MyClass一些受限制的方面,那麼你可以使用的Mockito嘲笑那些有限的方面,例如:

MyClass myClass = Mockito.mock(MyClass.class); 
Mockito.when(myClass.getX()).thenReturn("some test specific value"); 
Mockito.when(myClass.doX()).thenThrow(new RuntimeException("some test specific exception"); 
String x = "some x"; 
String y = "some y"; 
String y = "some z"; 

MyClassImpl sut = new MyClassImpl(); 
sut.addToCart(myClass, x, y, z); 

// continue with test assertions ... 

編輯1:基於在你的評論中「有一個空的檢查myclass對象myclass和myclass.getX()內的一個條件ddToCart()」 ......

X x = Mockito.mock(X.class); 
Mockito.when(myClass.getX()).thenReturn(x); 

......將確保在MyClass.getX()空檢查中addToCart()傳遞安全。而且,當然,因爲您創建了MyClass的模擬實例並將其傳遞到addToCart(),並且該實例顯然不爲空,所以傳遞給addToCart()myClass實例上的任何空檢查都將安全通過。

+0

它就像myClass.getX()一樣,getX()有三個變量,它們是類,這些類再次變得更深。 – Sawyer

+0

我明白了,所以模仿'MyClass'可以幫助你,但是如果你需要在'MyClass'內嘲諷'X',然後在'X'內''Y',你可能很快就會發現創建一個** My **實例** MyClass '可能不那麼耗時,可能會產生更具可讀性的測試代碼。 – glytching

+0

有一個空檢查的Myclass對象myclass和myclass.getX()內addToCart(),有沒有什麼辦法我可以Stubb重寫空檢查或使對象和值不爲空 – Sawyer

相關問題