매우 간단한 AsyncTask 구현 예제가 있으며 Android JUnit 프레임 워크를 사용하여 테스트하는 데 문제가 있습니다.
정상적인 응용 프로그램에서 인스턴스화하고 실행할 때 잘 작동합니다. 그러나 Android 테스트 프레임 워크 클래스 (예 : AndroidTestCase , ActivityUnitTestCase , ActivityInstrumentationTestCase2 등) 에서 실행되면 이상하게 작동합니다.
doInBackground()
메서드를 올바르게 실행 합니다.- 그러나 그것의 알림 방법 (의 호출하지 않는다
onPostExecute()
,onProgressUpdate()
등) - 아무것도하지 않고 오류를 표시하지 않고 그들을 무시합니다.
이것은 매우 간단한 AsyncTask 예제입니다.
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");
}
}
이것은 테스트 케이스입니다. 여기서 AsyncTaskDemoActivity 는 모드에서 AsyncTask를 테스트하기위한 UI를 제공하는 매우 간단한 활동입니다.
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());
}
}
이 모든 코드는 AsyncTask가 Android Testing Framework 내에서 실행될 때 알림 메서드를 호출하지 않는다는 점을 제외하고는 정상적으로 작동합니다. 어떤 아이디어?
Service.doSomething()
?