2011-07-28 71 views
2

我有一個類從另一個類調用方法來獲取報告狀態。如何在Java中使用mockito調用類的方法

Class A { 
    private classb b = new classb(); 
    method x() { 
    String xyz =b.method1(parm1, parm2) 
    } 
} 

因此,當爲方法x的Junit測試在b.method()上獲取空指針時。我已經創造了B級模擬並沒有跟隨

Mockito.doReturn(val).when(classbMock).method1(parm1,parm2); 

請幫助我怎麼能嘲笑B級,並獲得通過。

感謝

回答

0

代替ClassA的的實例是ClassB的的自己的實例,在通過A的構造函數(或者一個setter)通過B的實例:

public class ClassA { 
    public ClassA(ClassB b) { 
      this.b = b; 
    } 
    public void x() { 
      String blah = b.method1(parm1, parm2); 
    } 
} 
在您的測試

然後,您可以通過B與A的實例模擬版本正在測試:

ClassB classBMock = mock(ClassB.class); 
ClassA a = new ClassA(classBMock); 

和你真正的代碼可以在非模擬ClassB的版本中傳遞給A.

2

爲了嘲笑b你需要把它給A類的實例

至少還有幾個這樣的方式:

  1. 使用類似ReflectionUtils捅在A爲中心並改變字段的值
  2. A構造,使您可以注入的依賴到A
  3. 只是模擬A.x並假定b作品(因爲... e有它自己的單元測試)

我寧願選項3(假設A是受測試的東西而不是被測試的東西)。對於單元測試,我只想模擬直接依賴關係,而不是所有的瞬態依賴關係。

+0

我不同意3 - 在A的單元測試中,你想測試Ax()用b.method1()的返回值做什麼,以及它返回的結果 - 假設上面的示例代碼只是非常簡化(在現實世界中,它不會調用方法,也不會對響應做任何事) –

+0

也許我沒有正確地閱讀,但我想象的是C類,我們無法看到它正在測試中。它依賴於A.在那種情況下,我不想嘲笑A的家屬,我只是想嘲笑A。我認爲這是一個漫長的說法,我同意你的看法。 –

+0

是的,我們同意:)我把這個問題解釋爲爲A寫一個測試 –

相關問題