2011-06-08 80 views
4

我必須單元測試一些不支持單元測試(No DI)的舊代碼。有沒有辦法模擬一個公共方法中初始化的對象?嘲笑在外部不可見的依賴關係

public int method() { 

    A a = new A(ar1, arg2); //How to mock this? 

} 

感謝,

-Abidi

回答

1

另一種選擇是將代碼重構爲

public int method() { 
    A a = createA(arg1,arg2); 
} 

A createA(int arg1, int arg2) { 
    return new A(arg1,arg2); 
} 

在您的測試方法,現在你可以使用的Mockito的spydoAnswer功能在你的測試夾具上覆蓋createA,沿線有一些東西:

Foo foo = new Foo(); 
Foo spiedFoo = spy(foo); // a spied version when you can copy the behaviour 
doAnswer(new Answer() { 
    @Override 
    public Object answer(InvocationOnMock inv) throws Throwable { 
     A a = mock(A.class); 
     return a; 
    } 
}).when(mySpy).createA(anyInt(), anyInt()); 
0

如果你有過有問題的代碼控制,你可以重構它並根據一些A-建設者使依賴公衆,例如。這可能是最好的解決方案,因爲它會讓你的課程更少依賴A。 [強迫你解耦設計是測試的主要優勢之一。]