我的代码结构:
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();