单元测试中的Android连接超时(robolectric)

时间:2013-09-24 12:59:03

标签: android multithreading robolectric

我的线程有些问题。在调试模式期间和单元测试期间,AsyncTask不会作为单个线程执行。

此外,当我尝试将HTTP-Post测试到真实服务器时,我得到超时。我之前在模拟器中得到了它,它已经通过

解决了
StrictMode.setThreadPolicy(policy);

不幸的是,这对Robolectric不起作用,因为我收到错误

java.lang.NoClassDefFoundError: dalvik/system/CloseGuard$Reporter

如何解决这个问题并继续使用robolectric构建我的单元测试?我是否有可能在线程中处理错误? 异步任务:

public class HttpPostTask extends
    AsyncTask<MyContainer, Integer, MyResult> {
    @Override
    protected MyResult doInBackground(MyContainer... params) {
           /* some code here */
           resp = client.execute(container.post);
    }
}

执行异步任务:

new HttpPostTask().execute(container);

谢谢

===============更新=================== 我插入了一些打印件以确定帖子运行的线程。结果如下:

在模拟器中:

09-27 09:19:12.909: I/System.out(1813): Running REST Client on thread 'Thread-83' 
 09-27 09:19:12.909: I/System.out(1813): Running HTTP Post on thread 'AsyncTask #2'

在Robolectric:

Running REST Client on thread 'main' 
  Running HTTP Post on thread 'main' 

一段时间后我得到拒绝+超时异常:

org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2:8080 refused

要绕过Robolectric的HTTP Post我使用了这个:'Robolectric.getFakeHttpLayer().interceptHttpRequests(false);'

1 个答案:

答案 0 :(得分:4)

更新我正在研究Robolectric的更新,它会将一些基本的StrictMode方法变为无操作,因此不会炸毁测试套件。但是,如果你的应用程序在没有它的情况下无法运行,我仍然认为有些问题。


这里有一些事情:

任务安排

Robolectric运行单线程。它模拟了UI和背景技术,并允许您使用Robolectric.getUiThreadScheduler()Robolectric.getBackgroundScheduler()在测试中与它们进行交互。使用Scheduler,您可以pause()unPause()runOneTask()等。默认情况下,所有AsyncTask都会在execute()

后立即运行

测试HTTP请求

虽然结合Android和底层Web服务器的完整集成测试是一个好主意,但大多数Robolectric测试更多的是单元测试性质。我建议使用Robolectric.addPendingHttpRequest()为大多数测试提供虚假回复。

StrictMode

我不认为Robolectric支持这个,但我没有调查过。鉴于Robolectric是单线程的,基于Android文档使用是没有意义的。