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

Другие вопросы по тегам