你会如何使用Mockito为这种方法编写测试?

时间:2015-07-16 10:22:51

标签: android unit-testing mockito

请协助。我似乎无法为此方法创建合适的测试:

protected void startInterfacing() {

    mLiveAuthClient.login(mView.context(), Arrays.asList(SCOPES), new LiveAuthListener() {

        @Override
        public void onAuthComplete(final LiveStatus liveStatus, final LiveConnectSession liveConnectSession,
                                   Object o) {

            // Login successful and user consented, now retrieve user ID and connect with backend server
            getUserIdAndConnectWithBackendServer(liveConnectSession, mLiveAuthClient);
        }

        @Override
        public void onAuthError(LiveAuthException e, Object o) {
            // We failed to authenticate with auth service... show error
            if (e.getError().equals("access_denied") ||
                    e.getMessage().equals("The user cancelled the login operation.")) {

                // When user cancels in either the login or consent page, we need to log the user out to enable
                // the login screen again when trying to connect later on
                logUserOut(mLiveAuthClient, false);
            } else {
                onErrorOccured();
            }
        }
    });
}

我会解释abit在这里发生的事情: 我正在尝试验证我的客户端并登录OneDrive。 该方法首先调用Live SDK的登录方法。该SDK对象是从本课程外部提供给我的。所以我基本上可以嘲笑它。 这就是我正在努力的方法:

  1. 我不需要测试对login方法的调用,因为它不是我的。我确实需要在onAuthComplete中测试对getUserIdAndConnectWithBackendServer()的调用。但是这种方法需要一个liveConnectSession对象。我该如何提供?它是在onAuthComplete方法上给我的。

  2. 如何模拟对onAuthComplete和onAuthError的调用?我读到了ArgumentCaptor,但是当我使用它时,我需要在调用实际方法时为这些方法提供参数。 例如,argument.getValue()。onAuthComplete()要求我为此调用添加参数。我在这里实际提供了什么?

  3. 下一个方法大致相同但有自己的问题:

     protected void getUserIdAndConnectWithBackendServer(final LiveConnectSession liveConnectSession, final LiveAuthClient
            authClient) {
    
        final LiveConnectClient connectClient =  new LiveConnectClient(liveConnectSession);
    
        connectClient.getAsync("me", new LiveOperationListener() {
            @Override
            public void onComplete(LiveOperation liveOperation) {
    
                // We got a result. Check for errors...
                JSONObject result = liveOperation.getResult();
                if (result.has(ERROR)) {
                    JSONObject error = result.optJSONObject(ERROR);
                    String code = error.optString(CODE);
                    String message = error.optString(MESSAGE);
                    onErrorOccured();
                } else {
                    connectWithBackend(result, liveConnectSession, authClient);
                }
            }
    
            @Override
            public void onError(LiveOperationException e, LiveOperation liveOperation) {
                // We failed to retrieve user information.... show error
                onErrorOccured();
                logUserOut(authClient, false);
            }
        });
    }
    

    在这里我想模拟JSONObject。但是如何调用onComplete方法或onError方法。我将提供什么作为方法为我提供的论据。例如LiveOperation?

    谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用的解决方案是使用mockito的doAnswer()结构。 这使我能够获得回调参数并调用其中一个方法。 另一个解决方案是使用ArgumentCator。