2014-06-25 164 views
-1

使用Android测试框架测试Android应用程序时,如何使测试等待我在继续之前等待网络响应。我不想使用Thread.sleep,因为我不确定要等多久。还尝试了waitForIdleSync(),但它似乎不工作。有没有其他方法?Android单元测试

我有enterCredentials方法输入用户名和密码,然后单击登录按钮。在获取用户对象以验证凭据之前,我需要等待一段时间才能获得用户对象并将其保存在数据库中。我想要一个替代Thread.sleep()在这里。我已经尝试了waitForIdleSync(),但似乎没有工作。

@Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     mActivity = getActivity(); 
     enterCredentials();  
     Thread.sleep(2000); 
     testLoggedInUser(); 

    } 

    public void testLoggedInUser() { 
     mMyApplication = this.getInstrumentation().getTargetContext().getApplicationContext(); 
     User user = mMyApplication.getUser(); 
     String email = user.getEmail(); 
     assertEquals(EMAIL, email); 
    } 

    public void enterCredentials() { 

     final EditText mUsername = (EditText) mActivity.findViewById(R.id.email); 
     final EditText mPassword = (EditText) mActivity.findViewById(R.id.password); 
     final Button login = (Button) mActivity.findViewById(R.id.logIn); 
     mActivity.runOnUiThread(new Runnable() { 

      public void run() { 
       mUsername.setText(EMAIL); 
       mPassword.setText(PASSWORD); 
       login.performClick(); 
      } 
     }); 

    } 
+0

..很??请细化你的问题,因为我不明白你的问题是什么。 – cybermonkey

+1

你正在运行什么样的测试?,除了接受/集成测试你的测试应该是快速和独立的,你应该模拟/间谍/ ......你的界限,特别是网络请求 – tkanzakic

+0

我想在我的应用程序中测试登录功能,我输入凭据并发送发布请求,服务器返回给我一个用户对象。所以在测试时我想等待接收这个用户对象,然后我可以验证用户凭证。那么在这种情况下,我该如何让测试等待呢? – user3773337

回答

1

您可以在一个大线程内运行两个线程。一个线程将等待连接同步。你可以把它变成一个if语句或者其他任何东西,并且有时间控制,只有当同步成功时才会调用另一个线程。如果达到您不希望测试运行的时间限制,则可以退出应用程序或您想要执行的任何操作。因此,您实际上会避免使用Thread.sleep(),并且还会有一些时间控制。

但是,如果您不想等太久,可以使用小间隔的Thread.sleep()和if语句来检查连接是否最终成功。只需在退出之前尝试一下。