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



我的代码结构:

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

我是单元测试A类,并且不想实际调用MethodB()。有什么方法可以通过自定义响应模拟此方法调用。我尝试了Mockito来模拟此方法,如下所示:

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

在调用methoda()上以上方式我在A中调用MethodB()时不会获得fastorResponse。但是当我使用classbmock调用methodb()时,我会得到castureResponse。无论如何,我可以在拨打methoda()时从methodb()中获得casterresponse。

这样做的一种常见方法是将协作者实例的创建提取到方法,而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();

相关内容

  • 没有找到相关文章