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

时间:2012-03-19 17:21:08

标签: android unit-testing

我见过很多与此相关的帖子,但似乎没有一个与我有相同的问题。 GetBusinessRulesTask扩展了AsyncTask。当我在单元测试用例中执行它时,onPostExecute()永远不会被调用。但是,如果我使用真实的客户端代码,则每次都会调用onPostExecute()。不知道我在这里做错了什么。

测试用例:

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:

@Override
protected void onPostExecute(AsyncTaskResponse<O> response) {
    Log.d(TAG, "onPostExecuted");
    if (mReceiver != null) {
        mReceiver.onReceiveResult(response.getResponse(),   response.getException());
    }
}

DoInBackground:

@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);
    }
}

启动方法()

public AsyncTask<Void, Void, AsyncTaskResponse<BusinessRules>> start(
        Context context) throws NetworkConnectionException {
    super.start(context);
    Log.d(TAG, "start");
    return execute();
}

发现问题。不要让你的AsyncTask最终并将它放在runnable中。

修复:

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();
    }
}

1 个答案:

答案 0 :(得分:5)

发现问题。不要让你的AsyncTask最终并将它放在runnable中。

修复:

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();
    }
}