我的线程有些问题。在调试模式期间和单元测试期间,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);'
答案 0 :(得分:4)
更新我正在研究Robolectric的更新,它会将一些基本的StrictMode
方法变为无操作,因此不会炸毁测试套件。但是,如果你的应用程序在没有它的情况下无法运行,我仍然认为有些问题。
这里有一些事情:
Robolectric运行单线程。它模拟了UI和背景技术,并允许您使用Robolectric.getUiThreadScheduler()
和Robolectric.getBackgroundScheduler()
在测试中与它们进行交互。使用Scheduler
,您可以pause()
,unPause()
,runOneTask()
等。默认情况下,所有AsyncTask
都会在execute()
虽然结合Android和底层Web服务器的完整集成测试是一个好主意,但大多数Robolectric测试更多的是单元测试性质。我建议使用Robolectric.addPendingHttpRequest()
为大多数测试提供虚假回复。
我不认为Robolectric支持这个,但我没有调查过。鉴于Robolectric是单线程的,基于Android文档使用是没有意义的。