2014-02-26 30 views
4

這是我的情況,我有2個非常簡單的類:PowerMock whenNew without @PrepareForTest?

public class B { 

    public void doSomething(){ 
     System.out.println("doSomething B reached"); 
    } 
} 

和:

public class A { 

public void doSomething(){ 
    B b = new B(); 
    b.doSomething(); 
    System.out.println("doSomething A reached"); 
} 

}

我想測試A級與中的Mockito方法DoSomething的。因此,我想模擬一個B類的實例,並在實例化類B時將它給予A.我根本不需要b.doSomething(),這是出於隔離的原因。

我知道我可以通過創建以下單元測試達到這一行爲:

@RunWith(PowerMockRunner.class) 
public class TestA { 

    @Test 
    @PrepareForTest(A.class) 
    public void testDoSomethingOfA() throws Exception{ 
     A a = PowerMockito.spy(new A()); 
     B b = PowerMockito.mock(B.class); 
     PowerMockito.whenNew(B.class).withNoArguments().thenReturn(b); 
     a.doSomething(); 
    } 
} 

導致輸出:

doSomething A reached 

所以這個工作!不過,我現在的問題是我們使用Jococo插件進行測試覆蓋。 Jococo不包括使用@PrepareForTest(A.class)語句測試的代碼。我公司重視準確的代碼測試覆蓋率。

我的問題:是否有另一種方法可以讓A實例化B而無需使用@PrepareForTest語句?

非常感謝提前!

+1

是賺不到''B' A'期權的構造函數的參數?或者至少有一家工廠提供'B'實例?或者使用依賴注入? – fge

+0

這將是我的最後一招!但是我很想在重構它之前不要觸摸現有的代碼。在重構之前,我真的很喜歡實體單元測試。 –

+0

我知道代碼並不漂亮,我同意無論是工廠還是依賴注入都是更好的解決方案,但是在這一點上,我無法觸及代碼 –

回答