2017-02-28 76 views
2

如何在爲靜態方法編寫junit時從靜態方法調用實例方法調用?我正在爲現有代碼編寫測試。如何在編寫靜態方法的junit時從靜態方法中模擬實例方法調用?

class A 
{ 
    public static D methodX() 
    { 
     B b = new B(); 
     C c = b.doSomething(); 
    } 
} 

class B 
{ 
    public C doSomething() 
    { 
    return C; 
    } 
} 

class Atest 
{ 
    @Test 
    public void testMethodX() 
    { 
     B b =Mockito.mock(B.class); 
     Mockito.when(b.doSomething()).thenReturn(new C()); 
     A.methodX(); 
     // some assertions 
    } 
} 

回答

0

通過您的標籤選擇,您已經知道您需要使用PowerMockito。

爲了注入B級的嘲笑版本我會做到以下幾點:

class A 
{ 
    public static D methodX() 
    { 
     B b = getBInstance(); 
     C c = b.doSomething(); 
    } 

    static B getBInstance(){ 
     return new B(); 
    } 

} 

測試類

@RunWith(PowerMockRunner.class) 
@PrepareForTest(A.class) 
class Atest 
{ 
    @Test 
    public void testMethodX() 
    { 
     B b =Mockito.mock(B.class); 
     PowerMockito.stub(PowerMockito.method(A.class, "getBInstance")).toReturn(b); 
     Mockito.when(b.doSomething()).thenReturn(new C()); 
     A.methodX(); 
     // some assertions 
    } 
} 

感謝PowerMockito.stub(PowerMockito.method通話你只會嘲笑getBInstance靜態方法和最後請致電A.methodX實施。

1

另一種完全不同的方法:做寫未測試的代碼。 靜態是良好的面向對象設計中的一個異常;在第一個步驟是簡單地靜態方法。

而當你有很好的理由仍然這樣做;然後以允許您進行合理的單元測試的方式編寫它們。

是的,可以使用PowerMock(ito)來解決這個問題,但更多的方法是簡單地修復您的生產設計。

的PowerMock(ITO)來框架在一定的成本;並且可以避免容易

因此,我的答案是:學習如何創建可測試代碼;並簡單地忘記PowerMock(您可以通過觀看這些videos開始)。