【发布时间】:2011-06-08 09:11:03
【问题描述】:
我必须对一些不支持单元测试(无 DI)的旧代码进行单元测试。有没有办法模拟一个在公共方法中初始化的对象?
public int method() {
A a = new A(ar1, arg2); //How to mock this?
}
谢谢,
-阿比迪
【问题讨论】:
我必须对一些不支持单元测试(无 DI)的旧代码进行单元测试。有没有办法模拟一个在公共方法中初始化的对象?
public int method() {
A a = new A(ar1, arg2); //How to mock this?
}
谢谢,
-阿比迪
【问题讨论】:
另一种选择是将代码重构为
public int method() {
A a = createA(arg1,arg2);
}
A createA(int arg1, int arg2) {
return new A(arg1,arg2);
}
现在,在您的测试方法中,您可以使用 Mockito 的 spy 和 doAnswer 函数来覆盖您的测试夹具上的 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());
【讨论】:
如果您可以控制相关代码,则可以重构它并公开依赖项,例如通过依赖某些 A-builder。这可能是最好的解决方案,因为它可以减少您的班级对A 的依赖。 [强迫你解耦你的设计是测试的主要优势之一。]
【讨论】: