模拟外部不可见的依赖项

时间:2011-06-08 09:11:04

标签: junit mockito

我必须对一些不支持单元测试(No DI)的旧代码进行单元测试。有没有办法模拟在公共方法中初始化的对象?

public int method() {

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

}

谢谢,

-Abidi

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

如果您可以控制相关代码,则可以重构它并使依赖性公开,例如依赖于某个A-builder。这可能是最好的解决方案,因为它可以减少您对A的依赖。 [强迫您解耦设计是测试的主要优势之一。]