我有一个Activity
,它从OnCreate()
方法中的Application
扩展类(应用程序上下文)中提取对象。
unit testing此活动时,所需的对象不存在,因为它是从先前的Activity填充并存储在上述应用程序上下文中。
不用说,当我从ActivityInstrumentationTestCase2
扩展测试用例中调用getActivity()
,我得到一个空指针exception。
如何在活动开始之前填充上下文并将其提供给该Activity
?
更新:经过一些挖掘后,我发现: this.getInstrumentation().getTargetContext()
然后将其this.getInstrumentation().getTargetContext()
转换为我的Application
扩展类的types。 但我得到一个类强制转换exception,跟踪指向这个:
04-04 21:02:27.036: INFO/TestRunner(431): started: testIt(edu.rockies.rockies.activity.courses.test.TopicTest) 04-04 21:02:27.126: INFO/TestRunner(431): failed: testIt(edu.rockies.rockies.activity.courses.test.TopicTest) 04-04 21:02:27.126: INFO/TestRunner(431): ----- begin exception ----- 04-04 21:02:27.136: INFO/TestRunner(431): java.lang.ClassCastException: android.app.ApplicationContext 04-04 21:02:27.136: INFO/TestRunner(431): at edu.rockies.rockies.activity.courses.test.TopicTest.setUp(TopicTest.java:27) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestCase.runBare(TestCase.java:125) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult$1.protect(TestResult.java:106) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult.runProtected(TestResult.java:124) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult.run(TestResult.java:109) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestCase.run(TestCase.java:118) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430) 04-04 21:02:27.136: INFO/TestRunner(431): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 04-04 21:02:27.136: INFO/TestRunner(431): ----- end exception ----- 04-04 21:02:27.156: INFO/TestRunner(431): finished: testIt(edu.rockies.rockies.activity.courses.test.TopicTest)
this.getInstrumentation().getTargetContext()
应返回contexttypes的对象。 但是我得到了android.app.ApplicationContext
类的强制执行,这是没有意义的。
更新2:
我做了一些更多的研究,并发现了android.app.Application
java.lang.Object android.content.Context android.app.ApplicationContext android.app.Application
但谷歌自己的Android Javadoc指的是:
java.lang.Object android.content.Context android.content.ContextWrapper android.app.Application
这是怎么回事? 有些事情不对。
更新3:
我已经替换了以下代码行:
this.getInstrumentation().getTargetContext();
用这行代码。
this.getInstrumentation().getTargetContext().getApplicationContext();
尽管上下文正确解析,但它似乎与活动的上下文不同。
好的,这个问题已经解决了。 要在调用getActivity()之前访问上下文,您需要调用此函数:
Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
您可以为Context调用静态方法:
Context context = InstrumentationRegistry.getTargetContext();
更多细节可以在这里find: https : //developer.android.com/training/testing/integration-testing/index.html
始终使用this.getInstrumentation().getTargetContext()
来访问应用程序的上下文。
this.getInstrumentation().getTargetContext().getApplicationContext()
与this.getInstrumentation().getTargetContext()
我在4.0.X版本中运行自动化,大多数时候getApplicationContext()
返回null上下文。
使用较新的UI测试框架, getInstrumentation()
不再可用。 获取Application
对象的一种方法是强制转换应用程序Context
:
Application app = (Application) InstrumentationRegistry .getTargetContext() .getApplicationContext();