Почему я получаю NullPointerException, когда пытаюсь получить фрагмент из fragmentManager в Android Test?

Здравствуйте, я новичок в тестировании Android. Я пытался проверить, видна ли кнопка в моем приложении во время теста пользовательского интерфейса. Я пишу что-то:

@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> mRule = new ActivityTestRule<>(MainActivity.class);

@Before
public void setUp() {
}

@Test
public void clickOnProductTest() {
    if (isRegisterClosed()) {
        openRegister();
    }
    onView(withText("Food")).perform(click());
    onView(withText("Mineral water")).perform(click());
}

private boolean isRegisterClosed() {
    MainActivity activity = mRule.getActivity();
    FragmentManager fragmentManager = activity.getFragmentManager();

    Fragment f = fragmentManager.findFragmentById(R.id.current_order_fragment);

    View v = f.getView();

    Button b = (Button) v.findViewById(R.id.orderOpenRegister);
    return b.getVisibility() == View.VISIBLE;
}

private void openRegister() {
    onView(withId(R.id.orderOpenRegister)).perform(click());
}

В сети

Просмотр v = f.getView(); //в методе isRegisterClosed()

Я получаю исключение NullPointerException. Похоже, фрагмент не загрузился. Но я не знаю почему. Но когда я пытаюсь нажать кнопку в этом фрагменте, он работает:

onView (withId (R.id.orderOpenRegister)). Выполнить (щелчок());

Я хочу сделать что-то вроде:

if (buttonIsVisible) {
      do smth;
}
else {
      do smth else;
}

Эта кнопка находится в current_order_fragment, и ее идентификатор — orderOpenRegister.

Редактировать

Я узнаю, что я должен добавить следующую строку:

fragmentManager.executePendingTransactions();

поэтому мой метод выглядит так:

private boolean isRegisterClosed() {
        FragmentManager fragmentManager = activity.getFragmentManager();
        fragmentManager.executePendingTransactions();
        Fragment f  = fragmentManager
                      .findFragmentById(R.id.current_order_fragment);
        View v = f.getView();
        Button b = (Button) v.findViewById(R.id.orderOpenRegister);
        return b.getVisibility() == View.VISIBLE;
}

но если я это сделаю, мне нужно запустить этот тест в потоке пользовательского интерфейса. Кто-нибудь знает, как запустить тест в потоке пользовательского интерфейса?


person martaus    schedule 09.07.2015    source источник


Ответы (1)


Вы можете запустить тест в потоке пользовательского интерфейса, как показано ниже.

Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

instrumentation.runOnMainSync(new Runnable() {
  @Override
  public void run() { //your test
  }
});
person Ajit Singh    schedule 06.10.2015