我有Activity
从Application
方法中的OnCreate()
扩展类(应用程序上下文)中提取对象。
当单元测试此活动时,所需的对象不存在,因为它是从前一个Activity填充并存储在上述应用程序上下文中。
毋庸置疑,当我从getActivity()
扩展测试用例中调用ActivityInstrumentationTestCase2
时,我得到一个空指针异常。
如何在活动开始前填充上下文并将其提供给Activity
?
更新
经过一番挖掘后,我发现:this.getInstrumentation().getTargetContext()
然后将其转换为我的Application
扩展类的类型。但是我得到了一个类强制转换异常,并且跟踪指向了这个:
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()
应该返回类型为context的对象。但我得到的android.app.ApplicationContext
类强制转换没有意义。
更新2:
我做了更多的研究,发现了android.app.Application
java.lang.Object
android.content.Context
android.app.ApplicationContext
android.app.Application
但谷歌自己的Android Javadoc引用了this:
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.app.Application
发生了什么事?有些事情不对。
更新3:
我已经替换了以下代码行:
this.getInstrumentation().getTargetContext();
使用这行代码。
this.getInstrumentation().getTargetContext().getApplicationContext();
虽然上下文正确解析,但它似乎与活动的上下文不同。
答案 0 :(得分:51)
好的,这个问题已经解决了。要在调用getActivity()之前访问上下文,您需要调用此函数:
Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
答案 1 :(得分:3)
您可以为上下文调用静态方法:
Context context = InstrumentationRegistry.getTargetContext();
更多细节可以在这里找到: https://developer.android.com/training/testing/integration-testing/index.html
答案 2 :(得分:3)
随着较新的UI测试框架getInstrumentation()
不再可用。获取Application
对象的一种方法是强制转换应用程序Context
:
Application app =
(Application) InstrumentationRegistry
.getTargetContext()
.getApplicationContext();
答案 3 :(得分:1)
始终使用sequence = sequenceA
来访问应用程序的上下文。
this.getInstrumentation().getTargetContext()
与this.getInstrumentation().getTargetContext().getApplicationContext()
我在4.0.X版本中运行自动化,大部分时间this.getInstrumentation().getTargetContext()
都返回了null上下文。
答案 4 :(得分:0)
您可以使用androidx.test.core.app.ApplicationProvider.getApplicationContext()
获取应用程序上下文。将其投射到您的应用程序中,并且应该是正确的上下文。
答案 5 :(得分:0)
在科特林val context = InstrumentationRegistry.getInstrumentation().context
为我工作。
答案 6 :(得分:0)
请记住,我们需要以下一些内容,测试是 androidTest 而不是单元。
@RunWith(AndroidJUnit4::class)
class SomeInstrumentedTest {
private val appContext = InstrumentationRegistry.getInstrumentation().targetContext
@Test
fun useAppContext() {
// Context of the app under test.
Assert.assertEquals("your.package", appContext.packageName)
}
}