【问题标题】:Why i get a NullPointerException when I try to get a fragment from fragmentManager in Android Test?为什么我在 Android 测试中尝试从 fragmentManager 获取片段时得到 NullPointerException?
【发布时间】:2015-07-09 13:22:35
【问题描述】:

您好,我是 Android 测试的新手。我试图在 UI 测试期间检查我的应用程序中是否可见按钮。我写了一些东西:

@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)).perform(click());

我想做这样的事情:

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

此按钮位于 current_order_fragment 中,其 ID 为 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;
}

但如果我这样做,我需要在 UI 线程中运行此测试。有谁知道如何在 UI 线程上运行测试?

【问题讨论】:

    标签: android-fragments android-testing android-espresso


    【解决方案1】:

    您可以在 UI 线程中运行测试,如下所示

    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
    
    instrumentation.runOnMainSync(new Runnable() {
      @Override
      public void run() { //your test
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多