使用 Messenger 进行仪器测试

Instrumentation test using Messenger

我有一个使用 UPnP 服务器的应用程序。对于仪器测试,我想模拟它,即创建我自己的 UPnP 服务器,该服务器将由测试进行仪器化。不幸的是,UPnP 服务器似乎不能 运行 在与应用程序(它是一个 UPnP 客户端)相同的进程(在测试包中),所以我决定将这个 UPnP 服务器放在不同的 APK 中并使用 Android 的 Messenger 功能。

我已经为另一个项目设置了这样的 IPC,所以我从那里使用了一些代码,我能够成功地将消息从测试(客户端)发送到 UPnP 服务器。但是,测试无法从服务器接收任何消息。我在消息的 replyTo 字段中发送客户端的 Messenger 对象,服务器正在使用此 Messenger 发回另一条消息 - 发送似乎成功,但没有任何消息到达客户端。如果客户端在服务器开始发送回复之前断开连接,那么在发送回复期间我会收到一个异常,即接收者不可用。对我来说,这意味着用于回复的 Messenger 对象是正确的。

有没有人遇到过类似的问题或知道这里的问题是什么? 为什么此 Android IPC 不适用于仪器(功能测试)? Android对测试包下代码的处理有什么不同吗?

我认为这无关紧要,但我正在使用 Robotium 进行测试。

所以问题原来是(当然)我的消息 Handler。 它是在测试 setUp() 期间创建的,因此它是 在 Instrumentation Thread 上创建的。测试方法的执行在此 Instrumentation Thread 中再次完成(除非您在 UI 线程上将其注释为 运行)。这意味着在执行测试方法时,无法执行消息处理程序,因此永远不会收到消息。

在新线程中创建处理程序(使用循环程序),解决了我的问题。


该视频非常有助于提供有关 IPC 在 Android 中的工作原理以及 Messenger 真正为您做些什么的更多信息。 https://newcircle.com/s/post/1340/deep_dive_into_android_ipc_binder_framework_at_andevcon_iv