Junit 模拟外部不可见的依赖项

Junit 模拟外部不可见的依赖项,junit,mockito,Junit,Mockito,我必须对一些不支持单元测试(无DI)的旧代码进行单元测试。有没有办法模拟在公共方法中初始化的对象 public int method() { A a = new A(ar1, arg2); //How to mock this? } 谢谢 -Abidi如果您可以控制所讨论的代码,您可以重构它并公开依赖关系,例如,通过依赖某个A-builder。这可能是最好的解决方案,因为它可以减少类对A的依赖。[强制您解耦设计是测试的主要优势之一。]另一个选择是将代码重构为 public int

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

public int method() {

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

}
谢谢


-Abidi

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

另一个选择是将代码重构为

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());