2011-06-08 81 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。 [强迫你解耦设计是测试的主要优势之一。]