1

如果AsyncTask由按钮上的点击事件触发,我该如何测试它 - 我如何等待AsyncTask完成?如何测试点击触发的AsyncTask?

注意我总是可以直接在我的测试方法中执行AsyncTask,我知道如何测试这种情况。但是,如果我坚持使用使用performClick()来模拟onClick事件,我仍然可以测试我的注册过程吗?

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'的替代方案。我的挑战是测试通过'onClick'事件间接触发的'AsyncTask'。您基本上都告诉我在我的测试类中执行'AsyncTask' - 绕过按钮 – ericn

+0

的onClick事件,您可以在oncreate中创建asyn对象,然后在onclick方法中执行asyntask并调用方法名称,如' waitForMe“,它包含这个等待asyn完成的while循环的定义。 –

+0

我相信这里有一个很大的误解。请结帐我的编辑:) – ericn

1

链接使用您的ActivityActivityTestCase。通过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); 
} 

或者你可以等到的AsyncTask变化Status.FinishedStatus

+1

get方法返回doInbackground的结果但是如果我们看到asyntask的生命周期onpostExecute仍然运行。 –