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

时间:2011-04-04 20:53:01

标签: android unit-testing

我有ActivityApplication方法中的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();

虽然上下文正确解析,但它似乎与活动的上下文不同。

7 个答案:

答案 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)
    }
}

unit vs androidTest