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)
随着更新的UI测试框架getInstrumentation()不再可用。获取Application对象的一种方法是投射应用程序Context:
Application app =
(Application) InstrumentationRegistry
.getTargetContext()
.getApplicationContext();
Run Code Online (Sandbox Code Playgroud)
您可以使用 来获取应用程序上下文androidx.test.core.app.ApplicationProvider.getApplicationContext()。将其投射到您的应用程序中,它应该是正确的上下文。
| 归档时间: |
|
| 查看次数: |
23997 次 |
| 最近记录: |