Mockito:调用重载版本的方法

时间:2014-05-09 01:11:45

标签: mockito

我是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

1 个答案:

答案 0 :(得分:0)

您可以使用PowerMock测试最终方法:

  • 在测试用例的类级别使用@RunWith(PowerMockRunner.class)注释。
  • 在测试用例的类级别使用@PrepareForTest(ClassWithFinal.class)注释。
  • 使用PowerMock.createMock(ClassWithFinal.class)为此类的所有方法创建一个模拟对象(让我们将其称为mockObject)。
  • 使用PowerMock.replay(mockObject)将模拟对象更改为重播模式。
  • 使用PowerMock.verify(mockObject)将模拟对象更改为验证模式。

您可以在此页面中找到一些示例:

https://code.google.com/p/powermock/wiki/MockFinal

你也可以使用mockito with powermock:

https://code.google.com/p/powermock/wiki/MockitoUsage13