我是Mockito的新手并试图处理一个场景。
我有一个我正在监视的课程;
//Production Code Starts
class LoginRequest {
final Callable<String> buildRequest() {
callABC();
callXYZ();
Callable<String> callableObject = createCallable();
return callableObject;
}
final Callable<String> buildRequest(CallBack callBackObject) {
callABC();
callXYZ();
Callable<String> callableObject = createCallable(callBackObject);
return callableObject;
}
}
LoginRequest createLoginRequest() {
LoginRequest loginRequest = new LoginRequest();
return loginRequest;
}
Callable<String> callable = loginRequest.buildRequest();
Netowrk.submit(callable);
//Production Code ends
现在,我想要的是,当呼叫
时loginRequest.buildRequest()
使其应该传播到方法的参数版本; 所以不要打电话
buildRequest()
它应该调用
buildRequest(callBackObject);
所以我尝试了以下内容;
//Test Code Starts
LoginRequest createLoginRequest() {
final LoginRequest loginRequest = new LoginRequest();
final LoginRequest spy = Mockito.spy(loginRequest);
final CallBack callBackObject = new CallBack()//my CallBack object
Mockito.when(spy.buildRequest()).thenAnswer(new Answer<Callable<?>>() {
@Override
public Callable<String> answer(InvocationOnMock invocation)
throws Throwable {
Callable<String> callable = spy.buildRequest(callBackObject);
return callable;
}
});
return spy;
}
我在期待
loginReuest.buildRequest()
从它传播到的生产代码中调用 Answer.answer(){} 然后到
buildRequest(callBackObject);
从那里开始。
然而,正在发生的事情是,在致电原始
时loginReuest.buildRequest()
从生产代码中生成方法,它实际上调用了原始的
buildRequst()
并从那里致电
callABC()
制作,然后调用我的匿名
Answer.answer();
并最终致电
callable = spy.buildRequest(callBackObject);
并进入递归调用然后堆栈溢出。
有没有更好的方法来做这种事情。
感谢您的帮助
由于 大O
答案 0 :(得分:0)
您可以使用PowerMock测试最终方法:
您可以在此页面中找到一些示例:
https://code.google.com/p/powermock/wiki/MockFinal
你也可以使用mockito with powermock: