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

Sal*_*o69 31 android unit-testing

我有一个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)
Run Code Online (Sandbox Code Playgroud)

this.getInstrumentation().getTargetContext()应该返回类型为context的对象.但是我得到了android.app.ApplicationContext没有意义的类强制转换.

更新2:

我做了一些更多的研究,并发现了android.app.Application

java.lang.Object
    android.content.Context
        android.app.ApplicationContext
            android.app.Application
Run Code Online (Sandbox Code Playgroud)

但是,谷歌的自己的Android的Javadoc是指这个:

java.lang.Object
    android.content.Context
        android.content.ContextWrapper
            android.app.Application
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?有些东西不对.

更新3:

我已经替换了以下代码行:

this.getInstrumentation().getTargetContext();
Run Code Online (Sandbox Code Playgroud)

用这行代码.

this.getInstrumentation().getTargetContext().getApplicationContext();
Run Code Online (Sandbox Code Playgroud)

尽管上下文正确解析,但它似乎与活动的上下文不同.

Sal*_*o69 52

好的,这个问题已经解决了.要在调用getActivity()之前访问上下文,您需要调用此函数:

Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
Run Code Online (Sandbox Code Playgroud)

  • 这不是那么简单或者事情已经发生了变化:我发现this.getInstrumentation().getTargetContext()完全返回我的应用程序上下文(我知道这是肯定的,因为我有自定义"MyApplication"类)和.getApplicationContext()返回空值.所以我检索应用程序上下文的代码也适用于这种情况,请参阅https://github.com/andstatus/andstatus/blob/master/src/org/andstatus/app/data/MyPreferences.java,public static Context initialize(Context context_in,... object); - 如果从测试类调用,则context_in具有.getApplicationContext() (5认同)

fri*_*mle 6

随着更新的UI测试框架getInstrumentation()不再可用。获取Application对象的一种方法是投射应用程序Context

Application app = 
        (Application) InstrumentationRegistry
                .getTargetContext()
                .getApplicationContext();
Run Code Online (Sandbox Code Playgroud)


Jos*_*eph 5

您可以使用 来获取应用程序上下文androidx.test.core.app.ApplicationProvider.getApplicationContext()。将其投射到您的应用程序中,它应该是正确的上下文。