На самом деле мне нужно получить ответ на вызов API, для этого мне нужно Context.
На самом деле мне нужно получить ответ на вызов API, для этого мне нужно Context.
Ответы:
Обновить.
Просто используйте для версий 1.x и 2.x:
Robolectric.application;
А для версии 3.x:
RuntimeEnvironment.application;
А для версии 4.x:
добавьте в свой build.gradleфайл:
testImplementation 'androidx.test:core:1.0.0'
получить контекст с помощью:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.applicationстатический код (например, методы, @BeforeClassпомеченные значком), поскольку Robolectric, вероятно, не будет инициализирован в этот момент, а значение будет null.
Добавить
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
И используйте:
private val app = ApplicationProvider.getApplicationContext()
Для последней версии Robolectric 4.3 на данный момент в 2019 г.
ShadowApplication.getInstance ()
`и
Roboletric.application
оба изношены. Итак, я использую
Context context = RuntimeEnvironment.systemContext;
чтобы получить Context.
Чтобы получить контекст приложения, вы должны сделать следующее:
У меня это работает с Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.applicationили RuntimeEnvironment.application.getApplicationContext()если он работает для вас.
В выпуске 4.0-alpha-3 от 21 июля они удалены ShadowApplication.getApplicationContext() . Используйте RuntimeEnvironment.application.getApplicationContext()для любых тестов, помеченных @RunWith(RobolectricTestRunner::class).
Кроме того, в их текущем руководстве есть пример получения строковых ресурсов с использованием:
final Context context = RuntimeEnvironment.application;
(Обратите внимание, что документация javadocs для RuntimeEnvironmentи в ShadowApplicationнастоящее время отражает не-альфа-версию 3.x.)
В некоторых случаях вам может потребоваться контекст вашего приложения вместо контекста по умолчанию 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 $

Безопаснее использовать Robolectric.getShadowApplication()вместо Robolectric.applicationпрямого использования .
Robolectric.application
Согласен с ответами @EugenMartynov и @rds ....
Быстрый пример можно найти на Volley-Marshmallow-Release
в NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
Ссылка Volley доступна https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
вам нужно добавить зависимости в модуле волейбола в студии Android как:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
В вашем случае, я думаю, вам следует помнить о том, что вы на самом деле тестируете. Иногда возникновение проблем с непроверяемым кодом или кажущимся непроверяемым кодом является признаком того, что, возможно, ваш код нуждается в рефакторинге.
Для ответа на вызов API вы можете не захотеть тестировать сам вызов API. Возможно, нет необходимости проверять возможность отправки / получения информации от любой произвольной веб-службы, а скорее то, что ваш код обрабатывает и обрабатывает ваш ответ ожидаемым образом.
В этом случае может быть лучше провести рефакторинг кода, который вы пытаетесь протестировать. Разделите синтаксический анализ / обработку ответов на другой класс, который принимает простой, Stringи проведите тестирование этого класса , введя образцы строковых ответов.
Это более или менее соответствует идеям единой ответственности и инверсии зависимостей ( S и D в SOLID )
Хорошо, поэтому я знаю, что многие другие говорили этот ответ раньше и, возможно, уже устарели
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);
Я получил null, потому что часть when () была ПОСЛЕ инициализации sut. Это может помочь некоторым из вас.
также у меня есть
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
в начале урока
Также
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works