第二次测试时,getActivity() 永远不会返回

6
我有几个简单的测试,例如assertNotNull(mActivity);(我正在阅读M.D.Torres的“Android应用程序测试指南”)。正在测试的活动运行良好。每个单独的测试也都正常运行。但是如果我一次运行多个测试,在第二个测试中,getActivity()从不返回。在logcat中没有错误(最后一行为“Starting Intent ...”),没有任何内容。调试也没有太大帮助,如果我进入getActivity(),它会抱怨没有可用的源代码。
另一个测试项目-来自Google的ActivityTesting即使进行了多个测试也能正常运行,因此Eclipse已正确配置。
有人遇到过类似的情况吗?
2个回答

8

我重新创建了一个测试项目(就像“干净房间”一样),它成功了。然后我比较了两个项目,并找到了罪魁祸首。这是因为没有清理操作:

protected void tearDown() throws Exception {
}

如果我将其删除,所有测试都可以通过。如果我将其粘贴回去,第二个测试会挂起。现在我想阅读解释并准备将其标记为答案。
编辑:我应该在tearDown方法的末尾调用super.tearDown()。对不起打扰大家。

你不是唯一一个。谢谢! - iewnait
我也遇到了这个问题,所以你问它并没有打扰到任何人。我非常感谢你添加了解决方案! - jwir3

1
我使用ActivityInstrumentationTestCase2测试了一个使用ExoPlayer和正确资源清理的Activity。由于清理和最终检查对所有测试都是相同的,我认为tearDown()是实施它们的好地方。所有测试单独运行没有任何问题,但当我运行多个测试时,有时getActivity()没有返回。我的tearDown()执行了各种操作:
  • 检查活动状态(调用各种assert())
  • 检查播放器状态(调用各种assert())
  • 手动清除播放器资源(调用close()和release())
  • setActivity(null)(这引起了问题)
  • super.tearDown()
我尝试了所有建议的解决方法,如重写getActivity()和使用instrumentation的其他方法创建和清理活动。这些方法都没有帮助。
大量调试表明,上述情况下前一个测试的活动的onDestory()可能与下一个测试的活动的onCreate()重叠。因此,日志按以下顺序显示生命周期事件:
test1.getActivity();
test1.tearDown() called;
test1.tearDown() over;
test2.getActivity()
test2.onCreate();
test1.onStop(); --> why is this late?
test1.onDestroy(); --> why is this late?
test2.tearDown() called;
test2.tearDown() over;
test3.getActiviy() --> this should call test3.onCreate, but did not and never returned.

即使测试用例在不同的ActivityInstrumentationTestCase2类/文件中实现,这种情况仍会发生。第一次重叠不会导致问题,因此2个测试始终是OK的,但以任何顺序运行3个测试会导致此重叠,从而导致第3个getActivity()调用永远不返回。
我尝试了所有方法,如使用instrumentation手动调用onPause() + onStop() + onDestroy(),在测试之间引入非常长的睡眠期间,强制清除instrumentationTestCase的activity,重新排序tearDown的检查,但没有帮助。最后,我意外地在我的检查之前删除了setActivity(null),并且生命周期事件得到了正确的排序:
test1.tearDown() called;
test1.onStop();
test1.onDestroy();
test1.tearDown() over;
test2.getActivity()
test2.onCreate();
...

所以在我的情况下真正起作用的是:不要调用ActivityTestCase.setActivity()。这会导致super.tearDown()不直接调用活动的生命周期事件,清理将稍后发生并引起问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接