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