Mockito& Robolectric - 呼叫和测试下一个活动的测试结果

时间:2015-04-17 15:25:39

标签: android

我是Android测试的新手,我在测试活动在API调用结果后打开另一个活动时遇到了一些问题。

我粘贴了调用代码和成功时调用的回调:

Api.get_instance(this).login(Constants.API_USER, Constants.API_PASSWORD, this, Constants.API_REQUEST_CODE_LOGIN);

当答案从服务器返回时:

 @Override
    public void onTaskCompleted(int requestCode, List result) {
        ServiceResponse s;
        JSONObject j;
        switch (requestCode) {
            case Constants.API_REQUEST_CODE_LOGIN:
                s = (ServiceResponse) result.get(0);
                j = (JSONObject) s.get_extras();
                try {
                    ...
                    startHomeActivity();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

如果一切正常,我打电话给#34; startHomeActivity"

问题是在测试时,我得到一个空指针异常,因为测试不等待响应。

我尝试过使用mockito,但我得到了一个通缉但未使用以下代码调用:

@Test
    public void afterSplash_shouldStartHomeActivity() {

        Mockito.verify(mockApi).login(Constants.API_USER, Constants.API_PASSWORD, new AsyncTaskCompleteListener() {
            @Override
            public void onTaskCompleted(int requestCode, List result) {
                ShadowActivity shadowActivity = shadowOf(activity);
                Intent startedIntent = shadowActivity.getNextStartedActivity();
                ShadowIntent shadowIntent = shadowOf(startedIntent);
                Intent expectedIntent = new Intent(activity, HomeActivity.class);
                assertEquals(shadowIntent, expectedIntent);
            }

            @Override
            public void onTaskError(int requestCode, ServiceResponse error) {

            }
        }, Constants.API_REQUEST_CODE_LOGIN);


    }

有谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:0)

Mockito.verify()会告诉您相关方法是否已被测试中的应用程序访问,但它不会执行它。

我建议使用Robolectric 中提供的Http处理(此处显示为3.0 + assertj。它也可以在2.4中使用,但具有不同的类名)。排队将在下一次Http调用时传递的Http响应。然后检查是否设置了正确的活动。

@Test
public void afterSplash_shouldStartHomeActivity() {
 FakeHttp.addPendingHttpResponse(Constants.API_REQUEST_CODE_LOGIN, someHttpResponse);
 Api.get_instance(RuntimeEnvironment.application.getApplicationContext()).login(Constants.API_USER, Constants.API_PASSWORD, this, Constants.API_REQUEST_CODE_LOGIN);
 assertThat(ShadowApplication.getInstance().peekNextStartedActivity()).isInstanceOf(HomeActivity.class);

}