Android эспрессо с фрагментами. getActivity возвращает значение NULL
Я пытаюсь запустить некоторые интеграционные тесты с Espresso для простого действия, которое после запуска запускает загрузчик для получения некоторых данных.
Проблема в том, что когда я запускаю свои тесты (даже очень простые, такие как проверка, находится ли кнопка на главной странице), результат постоянно меняется, и я продолжаю получать различные времена NPE.
Попытка вызвать виртуальный метод 'android.content.Context.getApplicationContext()' для пустой ссылки на объект
Моя деятельность пуста и содержит фрагмент, и ошибка может быть отслежена до того момента, когда для запуска загрузчика я запрашиваю контекст
MyLoader loader = new MyLoader(getActivity(), certainUrl);
Из этого я получаю, что getActivity()
возвращается null
иногда, а затем вниз по строке это вызывает исключение (так как в классе Android Loader вызывается метод context.getApplicationContext)
Это мой тестовый класс
public class HomeFragmentTest extends ActivityInstrumentationTestCase2<HomeActivity> {
private HomeActivity _activity;
public HomeFragmentTest() {
super(HomeActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
_activity = getActivity();
injectInstrumentation(getInstrumentation());
}
public void testButton() {
onView(withId(R.id.button))
.check(matches(allOf(
isDisplayed(),
ViewMatchers.isCompletelyDisplayed()
)));
}
}
Спасибо всем за помощь
1 ответ
Измени свой setUp
метод, как в этом примере:
public class FirstActivityUnitTest extends
android.test.ActivityUnitTestCase<FirstActivity> {
private FirstActivity activity;
public FirstActivityUnitTest() {
super(FirstActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
Intent intent = new Intent(getInstrumentation().getTargetContext(),
FirstActivity.class);
startActivity(intent, null, null);
activity = getActivity();
}
@SmallTest
public void testSomething() {
// assertions here
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
}
Также проверьте, если в build.gradle
файл у вас есть эти зависимости:
android {
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
androidTestCompile 'com.android.support:support-annotations:23.+'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.1'
}
Наиболее важным здесь является объявить testInstrumentationRunner