【问题标题】:Mocking a dependency that is not visible outside模拟外部不可见的依赖项
【发布时间】:2011-06-08 09:11:03
【问题描述】:

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

public int method() {

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

}

谢谢,

-阿比迪

【问题讨论】:

    标签: junit mockito


    【解决方案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());
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-18
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多