Android 프로젝트에 대해 매우 간단한 단위 테스트 케이스를 작성 중이므로 테스트 케이스는 백그라운드에서 네트워크 작업을 수행하는 AsyncTask
을 간단히 실행합니다. 내 테스트 케이스에 대한 AndroidTestCase
클래스를 확장하고있다 :AndroidTestCase에서 AsyncTask의 onPostExecute()가 결코 호출되지 않습니다.
public class MyTest extends AndroidTestCase{
//use CountDownLatch to perform wait-notify behavior
private CountDownLatch signal;
@Override
public void setUp() throws Exception{
super.setUp();
//I use CountDownLatch to perform wait-notify behaviour
signal = new CountDownLatch(1);
}
@Override
public void runTest() throws Exception{
String params = "some params";
//MyAsyncTask does the networking tasks
new MyAsyncTask().execute(params);
//wait until MyAsyncTask is done
try {
signal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private class MyAsyncTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... params) {
//Do networking task e.g. access a remote database
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
//this never get called when run this test case, why?
Log.i("Debug","post execute");
signal.countDown();
}
}
}
위에서 볼 때, 나는 이 동작을 대기 통지 수행 할 CountDownLatch을 사용하고 있습니다.
MyAsicTask
후 시작, 내가 signal.await()
에 호출 완료 MyAsyncTask
에 대한을 기다립니다.
는 MyAsyncTask
의 onPostExecute()
콜백, 나는 signal.countDown()
에이 작업이 이루어집니다 통지 호출합니다.
그러나이 테스트 케이스를 실행하면 onPostExecute
은 호출되지 않습니다. & 해결 방법은 무엇입니까?
내가 runTest()
의 마지막 라인으로 Thread.sleep(30*1000)
을 추가
후 ======== 업데이트 ==========, 내가 네트워크 운영에서 더 많은 로그를 볼 수 있습니다. 네트워크 작동이 완료되기 전에 teardown()
이 호출됨을 증명합니다. 나는 tearDown(), android 테스트 프레임 워크에서 아무것도하지 않았다. 자동으로 호출합니다.
내 보냄을 사용하여 CountDownLatch
이 작동하지 않습니다 ... 이유가 무엇입니까?
doInBackground의 예외는 무엇입니까? – Triode
'doInBackground'에서 뭔가 잘못되어'onPostExecute'가 호출을받지 못합니다. – d3m0li5h3r
@ d3m0li5h3r doInbackground()가 충돌하여 비동기 작업을 취소하지 않으면 onPostExecute()가 실행되지 않습니다. –