Ответ 1
Хорошо, эта проблема решена. Чтобы получить доступ к контексту до вызова функции getActivity(), вам необходимо вызвать эту функцию:
Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
У меня есть Activity
, который вытягивает объект из расширенного класса Application
(контекст приложения) из метода OnCreate()
.
Когда модуль тестирует это действие, нужного объекта нет, потому что он заполняется из предыдущего действия и сохраняется в вышеупомянутом контексте приложения.
Излишне говорить, что когда я вызываю 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. Но я получаю exeption класса android.app.ApplicationContext
, который не имеет смысла.
Обновление 2:
Я сделал еще несколько исследований и обнаружил это для android.app.Application
java.lang.Object
android.content.Context
android.app.ApplicationContext
android.app.Application
Но собственный Google Android Javadoc относится к this:
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();
Всегда используйте this.getInstrumentation().getTargetContext()
для доступа к контексту приложения.
this.getInstrumentation().getTargetContext().getApplicationContext()
не совпадает с this.getInstrumentation().getTargetContext()
Я запускал автоматизацию в версиях 4.0.X и большую часть времени getApplicationContext()
возвращал нулевой контекст.
Вы можете вызвать статический метод для Контекста:
Context context = InstrumentationRegistry.getTargetContext();
Более подробную информацию можно найти здесь: https://developer.android.com/training/testing/integration-testing/index.html