AsyncTask onPostExecute()不在unit testing用例中调用

我已经看到了一堆相关的post,但没有似乎有我遇到的同样的问题。 GetBusinessRulesTask扩展AsyncTask。 当我在unit testing用例中执行这个时,onPostExecute()永远不会被调用。 但是,如果我使用真正的客户端代码,则每次都会调用onPostExecute()。 不知道我在这里做错了什么。

testing用例:

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最终放到可运行的内部。

修正:

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

Solutions Collecting From Web of "AsyncTask onPostExecute()不在unit testing用例中调用"

发现问题。 不要让你的AsyncTask最终放到可运行的内部。

修正:

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