使用Robolectric/AndroidJUnit4测试PdfDocument时遇文档已关闭异常
为什么测试PdfDocument时会抛出"document is closed!"异常?
你遇到的这个问题其实是Robolectric对android.graphics.pdf.PdfDocument的模拟实现存在局限性导致的。
在真实的Android设备上,当你创建PdfDocument实例后,它默认处于打开状态,你可以直接调用startPage()来添加页面。但在Robolectric的测试环境中,它的模拟版本并没有完全对齐真实框架的行为——很多版本里,模拟的PdfDocument会错误地将初始状态标记为"已关闭",这就导致你调用startPage()时触发了IllegalStateException。
给你几个可行的解决思路:
- 升级Robolectric到最新版本:后续的Robolectric版本已经修复了不少关于
PdfDocument的模拟bug,升级后大概率能解决这个问题。 - 调整模拟文档的状态(如果支持):你可以通过Robolectric的Shadow类来手动修改文档的状态。比如尝试获取
ShadowPdfDocument并设置它为未关闭状态:
注意:这个方法依赖Robolectric的具体版本,部分旧版本可能没有提供这个接口。val shadowDoc = Shadows.shadowOf(doc) shadowDoc.setClosed(false) - 改用Instrumented Test(AndroidJUnit4):如果Robolectric的模拟问题一时无法解决,你可以把这段测试改成Instrumented Test,在真实设备或模拟器上运行。因为Instrumented Test会使用真实的Android框架实现,不会有模拟类的行为偏差,你的测试代码在真实环境下是完全正常的。
另外补充一下:你写的测试逻辑本身是没问题的——在真实设备上运行这段代码,不会抛出任何异常,完全符合预期。
内容的提问来源于stack exchange,提问作者XAM
相关产品推荐
相关产品推荐

