我必须对一些不支持单元测试(No DI)的旧代码进行单元测试。有没有办法模拟在公共方法中初始化的对象?
public int method() {
A a = new A(ar1, arg2); //How to mock this?
}
谢谢,
-Abidi
答案 0 :(得分:1)
另一种选择是将代码重构为
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());
答案 1 :(得分:0)
如果您可以控制相关代码,则可以重构它并使依赖性公开,例如依赖于某个A-builder。这可能是最好的解决方案,因为它可以减少您对A
的依赖。 [强迫您解耦设计是测试的主要优势之一。]