1

我的线程有一些问题。在调试模式和单元测试期间,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);'

4

1 回答 1

4

更新我正在为 Robolectric 进行更新,它将把一些基本StrictMode方法变成无操作,这样它就不会破坏测试套件。但是,如果您的应用没有它就无法运行,我仍然认为有问题。


这里有几件事:

任务调度

Robolectric 运行单线程。它模拟 UI 和后台循环器,并允许您在测试中使用Robolectric.getUiThreadScheduler()和与它们进行交互Robolectric.getBackgroundScheduler()。使用Schedulers 你可以pause(),unPause()等等runOneTask()。默认情况下,所有AsyncTasks 将立即运行execute()

测试 HTTP 请求

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

严格模式

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

于 2013-09-24T18:15:59.253 回答