模拟来自另一个类的方法调用

时间:2015-05-08 11:10:06

标签: java unit-testing mockito stubbing

我的代码结构:

class A {
    void methodA() {
        //some code
        B b = new B();
        response = b.methodB(arg1, arg2);
        //some code using "response"
    }
}

我是UNIT测试A级,并且不想实际调用methodB()。有没有办法通过自定义响应模拟此方法调用。 我试着用Mockito来模拟这个方法调用,如下所示:

B classBMock = Mockito.mock(B.class);
Mockito.when(classBMock.methodB(arg1, arg2)).thenReturn(customResponse);
A objA = new A();
objA.methodA();

在调用方法A()上面的方法我在A中调用methodB()时不会得到customResponse。但是当我用classBMock调用methodB()时,我得到了customResponse。 无论如何,我可以在调用methodA()时从methodB()获取customResponse。

1 个答案:

答案 0 :(得分:2)

执行此操作的一种常用方法是将协作者实例的创建提取到方法,并spy要测试的类。

在这种情况下,您可以像这样重写A

public class A {
    public B createB() {
        return new B();
    }

    public void methodA() {
        //some code
        B b = createB();
        response = b.methodB(arg1, arg2);
       //some code using "response"
    }
}

现在,您的测试可以spy您正在测试的A实例,并为B注入模拟:

B classBMock = Mockito.mock(B.class);
Mockito.when(classBMock.methodB(arg1, arg2)).thenReturn(customResponse);
A objA = Mockito.spy(new A());
Mockito.when(objA.createB()).thenReturn(classBMock());
objA.methodA();


修改:
如果您无法修改A,另一种方法可能是使用PowerMock。请注意,此代码段仅显示相关的模拟,并且不显示允许PowerMock检测您的类所需的注释:

B classBMock = Mockito.mock(B.class);
Mockito.when(classBMock.methodB(arg1, arg2)).thenReturn(customResponse);
PowerMockito.whenNew(B.class).withNoArguments().thenReturn(classBMock);
A objA = new A();
objA.methodA();