首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >单元测试用例中未调用AsyncTask onPostExecute()

单元测试用例中未调用AsyncTask onPostExecute()
EN

Stack Overflow用户
提问于 2012-03-20 01:21:08
回答 1查看 4.5K关注 0票数 10

我已经看到了一堆与此相关的帖子,但似乎没有一个有和我一样的问题。GetBusinessRulesTask扩展了AsyncTask。当我在单元测试用例中执行时,onPostExecute()永远不会被调用。但是,如果我使用真正的客户端代码,那么每次都会调用onPostExecute()。不知道我到底做错了什么。

测试用例:

代码语言:javascript
复制
package com.x.android.test.api;

import java.util.concurrent.CountDownLatch;

import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
import android.widget.Button;

import com.x.android.api.domain.businessrule.BusinessRules;
import com.x.android.api.exception.NetworkConnectionException;
import com.x.android.api.tasks.GetBusinessRulesTask;
import com.x.android.test.activity.SimpleActivity;

 public class GetBusinessRulesTaskTest
    extends
        ActivityInstrumentationTestCase2<SimpleActivity> {
SimpleActivity mActivity;
Button mButton;

public GetBusinessRulesTaskTest() {
    super("com.x.android.test.activity", SimpleActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();
    mActivity = this.getActivity();
    mButton = (Button) mActivity
            .findViewById(com.x.android.test.activity.R.id.b1);
}

public void testPreconditions() {
    assertNotNull(mButton);
}

@UiThreadTest
public void testCallBack() throws Throwable {
    final CountDownLatch signal = new CountDownLatch(1);
    final GetBusinessRulesTask task = (GetBusinessRulesTask) new GetBusinessRulesTask(
            new GetBusinessRulesTask.Receiver<BusinessRules>() {
                @Override
                public void onReceiveResult(BusinessRules rules, Exception e) {
                    assertNotNull(rules);
                    assertNull(e);
                    signal.countDown();// notify the count down latch
                }
            });
    task.start(mActivity.getApplicationContext());
    try {
        signal.await();// wait for callback
    } catch (InterruptedException e1) {
        fail();
        e1.printStackTrace();
    }
}
}

OnPostExecute:

代码语言:javascript
复制
@Override
protected void onPostExecute(AsyncTaskResponse<O> response) {
    Log.d(TAG, "onPostExecuted");
    if (mReceiver != null) {
        mReceiver.onReceiveResult(response.getResponse(),   response.getException());
    }
}

DoInBackground:

代码语言:javascript
复制
@Override
protected AsyncTaskResponse<O> doInBackground(I... params) {
    Log.d(TAG, "doInBackgroundr");
    try {
        Uri uri = createUri(params);
        mBaseRequest = new GetLegacyRequest(uri);
        String json = mBaseRequest.executeRequest();
        O response = deserializeJson(json);
        Log.d(TAG, "Returning AsyncTaskResponse");
        return new AsyncTaskResponse<O>(response, null);
    } catch (Exception e) {
        Log.e(TAG, "Error", e);
        /*
        AsyncTaskResponse<O> maintenance = ReadBusinessControlledPropertiesTask.blockingCall(mServiceLocatorUrl);
        if(maintenance.getException() == null) {
            MaintenanceException mExcep = new MaintenanceException( maintenance.getResponse());
            if (mExcep.isUnderMaintenance())
                return new AsyncTaskResponse(null,mExcep);
        }*/
        return new AsyncTaskResponse<O>(null, e);
    }
}

启动方法()

代码语言:javascript
复制
public AsyncTask<Void, Void, AsyncTaskResponse<BusinessRules>> start(
        Context context) throws NetworkConnectionException {
    super.start(context);
    Log.d(TAG, "start");
    return execute();
}

找到问题所在。不要让你的AsyncTask成为最终的,并把它放在runnable中。

解决方法:

代码语言:javascript
复制
public void testCallBack() throws Throwable {
    final CountDownLatch signal = new CountDownLatch(1);
    // Execute the async task on the UI thread! THIS IS KEY!
    runTestOnUiThread(new Runnable() {
    @Override
        public void run() {
            try {
              GetBusinessRulesTask task = (GetBusinessRulesTask)new GetBusinessRulesTask(new GetBusinessRulesTask.Receiver<BusinessRules>() {
                            @Override
                            public void onReceiveResult(
                                    BusinessRules rules, Exception e) {
                                assertNotNull(rules);
                                assertNull(e);
                                signal.countDown();// notify the count downlatch
                            }
                        });
                task.start(mActivity.getApplicationContext());
            } catch (Exception e) {
                Log.e(TAG, "ERROR", e);
                fail();
            }
        }
    });
    try {
        signal.await();// wait for callback
    } catch (InterruptedException e1) {
        fail();
        e1.printStackTrace();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-21 00:19:36

找到问题所在。不要让你的AsyncTask成为最终的,并把它放在runnable中。

解决方法:

代码语言:javascript
复制
public void testCallBack() throws Throwable {
    final CountDownLatch signal = new CountDownLatch(1);
    // Execute the async task on the UI thread! THIS IS KEY!
    runTestOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
              GetBusinessRulesTask task = (GetBusinessRulesTask)new GetBusinessRulesTask(new GetBusinessRulesTask.Receiver<BusinessRules>() {
                            @Override
                            public void onReceiveResult(
                                    BusinessRules rules, Exception e) {
                                assertNotNull(rules);
                                assertNull(e);
                                signal.countDown();// notify the count downlatch
                            }
                        });
                task.start(mActivity.getApplicationContext());
            } catch (Exception e) {
                Log.e(TAG, "ERROR", e);
                fail();
            }
        }
    });
    try {
        signal.await();// wait for callback
    } catch (InterruptedException e1) {
        fail();
        e1.printStackTrace();
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9774792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档