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語句?
非常感謝提前!
是賺不到''B' A'期權的構造函數的參數?或者至少有一家工廠提供'B'實例?或者使用依賴注入? – fge
這將是我的最後一招!但是我很想在重構它之前不要觸摸現有的代碼。在重構之前,我真的很喜歡實體單元測試。 –
我知道代碼並不漂亮,我同意無論是工廠還是依賴注入都是更好的解決方案,但是在這一點上,我無法觸及代碼 –