На самом деле мне нужно получить ответ на вызов 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