На самом деле мне нужно получить ответ на вызов API, для этого мне потребовался Context
.
Как мы можем получить доступ к контексту приложения в Robolectric?
Ответ 1
Обновление.
Просто используйте для версий 1.x и 2.x:
Robolectric.application;
И для версии 3.x:
RuntimeEnvironment.application;
И для версии 4.x:
добавьте в свой файл
build.gradle
:testImplementation 'androidx.test:core:1.0.0'
получить контекст с помощью:
ApplicationProvider.getApplicationContext()
Ответ 2
Вы можете использовать
RuntimeEnvironment.application
Ответ 3
Используйте это:
Robolectric.application
Ответ 4
добавлять
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
И использовать:
private val app = ApplicationProvider.getApplicationContext()
Ответ 5
Чтобы получить контекст приложения, вы должны сделать следующее:
- аннотировать @RunWith (RobolectricTestRunner.class)
- RuntimeEnvironment.application.getApplicationContext()
Ответ 6
Для последней версии Robolectric 4.3 на 2019 год
ShadowApplication.getInstance()
' а также
Roboletric.application
оба деприцированы. Так что я использую
Context context = RuntimeEnvironment.systemContext;
чтобы получить контекст.
Ответ 7
Это работает для меня с Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
Ответ 8
Начиная с выпуска 4.0-alpha-3 21 июля, они удалили ShadowApplication.getApplicationContext()
. Придерживайтесь RuntimeEnvironment.application.getApplicationContext()
для любых тестов, аннотированных @RunWith(RobolectricTestRunner::class)
.
Кроме того, в их текущем руководстве есть пример получения строковых ресурсов с использованием:
final Context context = RuntimeEnvironment.application;
(Обратите внимание, что Javadocs для RuntimeEnvironment
и ShadowApplication
настоящее время отражают выпуск не альфа версии 3.x.)
Ответ 9
Безопаснее использовать Robolectric.getShadowApplication()
вместо прямого использования Robolectric.application
.
Ответ 10
В вашем случае, я думаю, вы должны помнить, что именно вы на самом деле проверяете. Иногда проблемы с непроверяемым кодом или, казалось бы, непроверенным кодом - это признак того, что, возможно, ваш код необходимо реорганизовать.
Для ответа на вызов API вы можете не захотеть проверить сам API-интерфейс. Возможно, нет необходимости проверять возможность отправки/получения информации с любого произвольного веб-сервиса, а скорее, что ваш код обрабатывает и обрабатывает ваш ответ в ожидаемой усадьбе.
В этом случае было бы лучше реорганизовать код, который вы пытаетесь проверить. Разбейте синтаксический анализ/обработку ответа на другой класс, который принимает простой String
и выполнит ваше тестирование в этом классе, введя ответы с образцами строк.
Это более или менее соответствует идеям Single Responsibility and Dependency Inversion (S и D в SOLID)
Ответ 11
Согласитесь с ответами @EugenMartynov и @rds....
Быстрый пример можно найти в журнале Volley-Marshmallow-Release
в NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
Доступна ссылка волейбола https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
вам нужно добавить зависимости в модуле volley в студии android как:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
Ответ 12
Хорошо, поэтому я знаю, что многие другие сказали этот ответ раньше и могли уже устареть
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());
sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
sut = new BundleManagerImpl(mockApplication,
processHtmlBundle, resultListener, sharedPref);
Я получил нуль, потому что часть when() была ПОСЛЕ инициализации sut. Это может помочь некоторым из вас.
также у меня есть
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
в начале класса
Кроме
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
Ответ 13
Сначала добавьте следующее в свой build.gradle
:
testImplementation 'androidx.test:core:1.2.0'
затем используйте:
ApplicationProvider.getApplicationContext() as Application
Ответ 14
В некоторых случаях вам может понадобиться контекст вашего приложения вместо контекста Robolectris по умолчанию.
Например, если вы хотите получить имя вашего пакета. По умолчанию Robolectric вернет вам имя пакета org.robolectric.default
. Чтобы получить реальное имя пакета, сделайте следующее:
build.gradle
testImplementation 'org.robolectric:robolectric:4.2.1'
Ваш тестовый класс:
@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {
@Test
public void fooTestWithPackageName(){
Context context = ApplicationProvider.getApplicationContext();
System.out.println("My Real Package Name: " + context.getPackageName());
}
}
Убедитесь, что в вашем рабочем каталоге Run/Debug Configurations установлен рабочий каталог: $ MODULE_DIR $