SORU
23 ŞUBAT 2010, Salı


Android AsyncTask Testi ile test Çerçevesi

Çok basit AsyncTask uygulama bir örnek var ve sorun Android JUnit çerçeve kullanarak test etmek için var. Ben oluşturmak ve normal uygulama çalıştırmak zaman gayet güzel çalışıyor. Ancak Android Test çerçevesi sınıfları (örn . idam olunca ^em>AndroidTestCase,ActivityUnitTestCase,ActivityİnstrumentationTestCase2vb.) garip bir şekilde davranır: - Bu yürütür() doİnBackgroundyöntem doğru - Ancak bildirim yöntemlerinden birini çağırır değil (() onPostExecute,() onProgressUpdatevb.) -- sessizce hataları göstermeden onları yok sayıyor.

Bu çok basit AsyncTask örneği

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

}

Bu test bir durumdur. BuradaAsyncTaskDemoActivityçok basit bir Aktivite modunda test AsyncTask için UI sunuyor:

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

}

Tüm bu kod gayet iyi, Android AsyncTask içinde Test Çerçevesi tarafından yürütülen bildirim yöntemleri var çağırmak yok aslında başka çalışan yok. Herhangi bir fikir?

CEVAP
27 EYLÜL 2010, PAZARTESİ


Ünite-bazı test uygulanması sırasında benzer bir sorun tanıştım. Varisle birlikte çalıştığı bazı servis test etmem gerekiyordu, ve ApplicationTestCase derslerimi senkronize-ed test yöntemleri ile hizmet benim geri aramalar yapmak gerekli. Geri önce kendisi bitmiş genelde test yöntemi erişilen olurdu, verileri geri gönderilen test edilecekti. Denedim @UiThreadTest baskını hala işe yaramadı uygulanması.

Çalışmış olan aşağıdaki yöntemi buldum, ve hala kullanıyorum. Ben sadece CountDownLatch nesneleri bekle-haber uygulamak için sinyal (senkronize(kilit){... kilit.kullanabilirsiniz() bildirmek;}, ancak çirkin kod bu sonuç) mekanizması.

public void testSomething(){
final CountDownLatch signal = new CountDownLatch(1);
Service.doSomething(new Callback() {

  @Override
  public void onResponse(){
    // test response data
    // assertEquals(..
    // assertTrue(..
    // etc
    signal.countDown();// notify the count down latch
  }

});
signal.await();// wait for callback
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011
  • TouchePro

    TouchePro

    27 EYLÜL 2007