Saya memiliki contoh implementasi AsyncTask yang sangat sederhana dan saya mengalami masalah dalam mengujinya menggunakan kerangka kerja Android JUnit.
Ini berfungsi dengan baik ketika saya memberi contoh dan menjalankannya dalam aplikasi normal. Namun ketika dijalankan dari salah satu kelas framework Pengujian Android (yaitu AndroidTestCase , ActivityUnitTestCase , ActivityInstrumentationTestCase2 , dll.) Ia berperilaku aneh:
- Ini menjalankan
doInBackground()
metode dengan benar - Namun tidak memanggil salah metode pemberitahuan nya (
onPostExecute()
,onProgressUpdate()
, dll) - hanya diam-diam mengabaikan mereka tanpa menunjukkan kesalahan.
Ini adalah contoh AsyncTask yang sangat sederhana:
package kroz.andcookbook.threads.asynctask;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;
public class AsyncTaskDemo extends AsyncTask<Integer, Integer, String> {
AsyncTaskDemoActivity _parentActivity;
int _counter;
int _maxCount;
public AsyncTaskDemo(AsyncTaskDemoActivity asyncTaskDemoActivity) {
_parentActivity = asyncTaskDemoActivity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
_parentActivity._progressBar.setVisibility(ProgressBar.VISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected String doInBackground(Integer... params) {
_maxCount = params[0];
for (_counter = 0; _counter <= _maxCount; _counter++) {
try {
Thread.sleep(1000);
publishProgress(_counter);
} catch (InterruptedException e) {
// Ignore
}
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
String progressStr = "Counting " + progress + " out of " + _maxCount;
_parentActivity._textView.setText(progressStr);
_parentActivity._textView.invalidate();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
_parentActivity._progressBar.setVisibility(ProgressBar.INVISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected void onCancelled() {
super.onCancelled();
_parentActivity._textView.setText("Request to cancel AsyncTask");
}
}
Ini adalah kasus uji. Di sini AsyncTaskDemoActivity adalah Aktivitas yang sangat sederhana yang menyediakan UI untuk menguji AsyncTask dalam mode:
package kroz.andcookbook.test.threads.asynctask;
import java.util.concurrent.ExecutionException;
import kroz.andcookbook.R;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemo;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemoActivity;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.widget.Button;
public class AsyncTaskDemoTest2 extends ActivityUnitTestCase<AsyncTaskDemoActivity> {
AsyncTaskDemo _atask;
private Intent _startIntent;
public AsyncTaskDemoTest2() {
super(AsyncTaskDemoActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
_startIntent = new Intent(Intent.ACTION_MAIN);
}
protected void tearDown() throws Exception {
super.tearDown();
}
public final void testExecute() {
startActivity(_startIntent, null, null);
Button btnStart = (Button) getActivity().findViewById(R.id.Button01);
btnStart.performClick();
assertNotNull(getActivity());
}
}
Semua kode ini berfungsi dengan baik, kecuali fakta bahwa AsyncTask tidak memanggil metode pemberitahuannya ketika dijalankan oleh dalam Android Testing Framework. Ada ide?
Service.doSomething()
?