1

Если AsyncTask запускается нажатием кнопки на кнопке, как я могу ее протестировать - как я могу дождаться завершения AsyncTask?Как проверить AsyncTask, вызванный щелчком?

Примечание. Я всегда могу выполнить AsyncTask непосредственно в своем методе тестирования, я знаю, как тестировать такой сценарий. Однако, если я настаиваю на использовании имитации события onClick с использованием performClick(), могу ли я еще проверить свой процесс регистрации?

MainActivityFunctionalTest

public class MainActivityFunctionalTest extends 
      ActivityInstrumentationTestCase2<MainActivity> { 
    // ... 
     public void testRegistration() { 
     ImageButton submitBtn = (ImageButton) solo.getView(R.id.BtnR); 
     assertNotNull(submitBtn); 


     submitBtn.performClick(); 
       // How to do something when the registration is done? 
     } 
    // ... 
    } 

MainActivity (проекта для тестирования)

ImageButton submitBtn = (ImageButton) findViewById(R.id.BtnRegister); 
submitBtn.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       sendRegistration(); 
      } 
     }); 

public void sendRegistration() { 
     Processor processor = new Processor();// subclass of AsyncTask 
     processor.execute(); 
    } 

ответ

3

вы можете сделать:

myAsyn obj = new myAsyn(); 
obj.execute(); 

while(obj.getStatus()==AsynTask.status.Finished) 
{ 
//wait here 
} 

//when it finishes , this code will going to execute. 
+0

Спасибо, но это кажется альтернативой 'CountDownLatch'. Моя задача - протестировать «AsyncTask», которая косвенно запускается через событие onClick. Вы все в основном говорите мне, чтобы я выполнил «AsyncTask» в моем тестовом классе - минуя событие onClick на кнопке – ericn

+0

, вы можете создать объект asyn в oncreate, а затем по вашему методу onclick выполнить это asyntask и вызвать имя метода, например, waitForMe ', которые содержат определение этого цикла while, который ждет, пока не закончится asyn. –

+0

Я считаю, что здесь существует огромное недоразумение. Просьба проверить мои изменения :) – ericn

1

Используйте свой Activity от вашего ActivityTestCase. Найдите представление по id и просто отправьте событие в свое представление.

Более подробная информация о runTestOnUiThread:

private void buttonTest(Activity activity, int buttonId){ 
    Button button = (Button) activity.findViewById(buttonId); 
    assertNotNull("Button not allowed to be null", button); 
    button.performClick(); 
} 

private void runButtonTest(Activity activity, int buttonId){ 
     getInstrumentation().runTestOnUiThread(new Runnable() { 
      public void run() { 
       buttonTest(activity,buttonId); 
      } 
    Object o = activity.mAsyncTask.get(); 
    assertNotNull(o); 
} 

В качестве альтернативы вы можете подождать, пока Status из AsyncTaskStatus.Finished изменений.

+1

Получить методы return result from doInbackground Но если мы увидим, что жизненный цикл asyntask onpostExecute все еще оставлен для запуска. –