在调用getActivity()之前从Setup()中的TestSuite访问应用程序上下文

我有一个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();