2012-01-15 95 views
6

我有几个简单的测试,如assertNotNull(mActivity);(我正在阅读M.D.Torres的“Android应用程序测试指南”)。被测活动运行良好。每一个测试都可以运行。但是,如果我在第二次测试一次运行几次测试永远不会返回。 logcat中没有错误(最后一行“Starting Intent ...”),没有任何错误。调试也没有多大帮助,如果我步入getActivity(),它会抱怨没有可用的源代码。
另一个测试项目 - Google的ActivityTesting运行正常,即使有几个测试,所以Eclipse的配置是正确的。
有没有人遇到类似的东西?第二次测试getActivity()永不返回

回答

8

我再次重新创建测试项目(如“洁净室”),它工作。然后我比较了两个项目并找到了罪魁祸首。这是空的拆解:

protected void tearDown() throws Exception { 
} 

如果我删除它,所有测试运行绿色。如果我粘贴它,第二个测试挂起。现在我想阅读解释并准备好将其标记为答案。

编辑:我应该在tearDown方法的结尾呼叫super.tearDown()。 抱歉打扰大家。

+0

真棒,谢谢。 – 2012-03-06 19:56:44

+0

你不是唯一一个。谢谢! – iewnait 2012-12-03 22:58:51

+0

我也有这个问题,所以你不会因为问问题而烦扰任何人。我非常感谢您在解决方案中添加的内容! – jwir3 2014-01-29 18:59:24

1

我使用了ActivityInstrumentationTestCase2来测试一个使用ExoPlayer的Activity并且正确地清理资源。由于所有测试的清理和最终检查都是相同的,我认为tearDown()是实现它们的好地方。所有测试单独运行没有任何问题,但是当我运行多个测试时,有时getActivity()没有返回。我拆解()来实现不同的东西:活动

  • 检查状态(各种断言()调用)播放器的
  • 检查状态(各种断言()调用)
  • 手动清理的球员资源(通过调用close ()和release())
  • setActivity(空)(这引起了麻烦)
  • super.tearDown()

我尝试了所有建议的解决方法比如重写getActivity()并使用其他方法来创建和清理活动。这些方法没有帮助。

大量的调试显示,在上述情况下,先前测试活动的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()永远不会返回。

我尝试了所有的方法,例如手动使用工具调用onPause()+ onStop()+ onDestroy(),在测试之间引入非常长的睡眠时间,强制清除instrumentationTestCase的活动,重新排序tearDown的检查,但没有任何帮助。最后,我不小心删除我的支票之前setActivity(空),以及生命周期事件得到正确排序:

test1.tearDown() called; 
test1.onStop(); 
test1.onDestroy(); 
test1.tearDown() over; 
test2.getActivity() 
test2.onCreate(); 
... 

所以真正让我的情况的区别:不调用ActivityTestCase.setActivity()。这导致super.tearDown()不直接调用活动的生命周期事件,清理将在以后发生并造成麻烦。

相关问题