Насправді мені потрібно отримати відповідь на дзвінок 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.приклад
обидва знецінені. Так я і використовую
Context context = RuntimeEnvironment.systemContext;
щоб отримати контекст.
Щоб отримати контекст програми, потрібно зробити наступне:
Це працює для мене з Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
або RuntimeEnvironment.application.getApplicationContext()
якщо його працює для вас.
Станом на випуск 4.0-альфа-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 Configurationtions встановлено значення: $ 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);
Волейбольне посилання доступне 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, тому що, коли () частина була ПІСЛЯ ініціалізації sut. Можливо, це допоможе комусь із вас.
також у мене є
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
на початку заняття
Також
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works