Как мы можем получить доступ к контексту приложения в Robolectric?

На самом деле мне нужно получить ответ на вызов API, для этого мне потребовался Context.

Ответ 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 $ enter image description here enter image description here