Android fragments 为什么在Android测试中尝试从fragmentManager获取片段时会出现NullPointerException?
你好,我是Android测试的新手。在UI测试期间,我试图检查我的应用程序中是否有可见的按钮。我写了一些东西:Android fragments 为什么在Android测试中尝试从fragmentManager获取片段时会出现NullPointerException?,android-fragments,android-testing,android-espresso,Android Fragments,Android Testing,Android Espresso,你好,我是Android测试的新手。在UI测试期间,我试图检查我的应用程序中是否有可见的按钮。我写了一些东西: @RunWith(AndroidJUnit4.class) public class MainActivityTest { @Rule public ActivityTestRule<MainActivity> mRule = new ActivityTestRule<>(MainActivity.class); @Before public void set
@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());
}
此按钮位于当前\u顺序\u片段中,其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线程上运行测试吗?您可以在UI线程中运行测试,如下所示
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() { //your test
}
});
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() { //your test
}
});