android 片段场景在小吃店创建期间崩溃

问题描述

我有安卓应用程序。我正在使用片段场景编写测试来测试我的片段。我的测试很简单,看起来像这样:

FragmentScenario.launchInContainer(ShoppingPlanningFragment.class);
...
onView(withId(R.id.buttonRemove)).perform(click());

所以我点击了某个按钮,当点击这个按钮时,snackbar 是这样的:

Snackbar snackbar = Snackbar.make(getActivity().findViewById(R.id.planning_mode_layout),msg,Snackbar.LENGTH_LONG);

但我收到以下错误

androidx.test.espresso.PerformException: 执行'single 时出错 单击 - 在坐标:809,1949 和精度:16,16' on view 'with id 是 com.gitlab.robert.cebula.expirydate:id/buttonRemove'。在 androidx.test.espresso.PerformException$Builder.build(PerformException.java:5) 在 androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:25) 在 androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:36) 在 androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:106) 在 androidx.test.espresso.ViewInteraction.desugeredPerform(ViewInteraction.java:43) 在 androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:94) 在 com.example.expirydate.shoppingfragment.planningfragment.ShoppingPlanningFragmentTest.clickingRemove_shouldRemovePlanningItem(ShoppingPlanningFragmentTest.java:28) 在 java.lang.reflect.Method.invoke(Native Method) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:57) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:154) 在 org.junit.runners.Suite.runchild(Suite.java:128) 在 org.junit.runners.Suite.runchild(Suite.java:27) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:115) 在 androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) 在 androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:395) 在 android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074) 引起:android.view.InflateException:二进制 XML 文件第 41 行: 二进制 XML 文件第 41 行:错误膨胀类 android.widget.Button 引起:android.view.InflateException:二进制 XML 文件第 41 行: 错误膨胀类 android.widget.Button 引起的: java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance0(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:334) 在 android.view.LayoutInflater.createView(LayoutInflater.java:647) 在 com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58) 在 android.view.LayoutInflater.onCreateView(LayoutInflater.java:720) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:863) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:515) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 com.google.android.material.snackbar.Snackbar.make(Snackbar.java:165) 在 com.example.expirydate.shoppingfragment.planningfragment.ShoppingPlanningFragment.onRemoveButtonClicked(ShoppingPlanningFragment.java:106) 在 com.example.expirydate.shoppingfragment.planningfragment.ShoppingPlanningFragment.lambda$uAFpgVG-8MPel7g8tIF4mCnD_tU(未知 来源:0) 在 com.example.expirydate.shoppingfragment.planningfragment.-$$Lambda$ShoppingPlanningFragment$uAFpgVG-8MPel7g8tIF4mCnD_tU.onClick(未知 来源:2) 在 android.view.View.performClick(View.java:6256) 在 android.view.View$PerformClick.run(View.java:24701) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:53) 在 androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:155) 在 androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:149) 在 androidx.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:53) 在 androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:122) 在 androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:117) 在 androidx.test.espresso.action.Tap.sendSingleTap(Tap.java:27) 在 androidx.test.espresso.action.Tap.access$100(Tap.java:21) 在 androidx.test.espresso.action.Tap$1.sendTap(Tap.java:3) 在 androidx.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:23) 在 androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:16) 在 androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:65) 在 androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:15) 在 androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:3) 在 androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:2) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 引起:java.lang.UnsupportedOperationException:无法解决 索引 5 处的属性:TypedValue{t=0x2/d=0x7f0300ac a=-1} at android.content.res.TypedArray.getColorStateList(TypedArray.java:538) 在 android.widget.TextView.(TextView.java:1212) 在 android.widget.Button.(Button.java:172) 在 android.widget.Button.(Button.java:147) 在 android.widget.Button.(Button.java:123) ... 42 更多

如果我评论小吃店的创建,一切都会按预期进行。这里有什么问题,我该如何解决

解决方法

用于制作小吃店的视图。这应该包含在 要显示小吃店的视图层次结构。一般都可以 是与触发小吃店互动的视图,例如 一个被点击的按钮,或者一张被刷过的卡片。

val contextView = findViewById<View>(R.id.context_view)

Snackbar.make(contextView,R.string.text_label,Snackbar.LENGTH_SHORT)
    .show()

错误堆栈中的重点。

#41: Error inflating class android.widget.Button Caused by: android.view.InflateException: Binary XML file line #41: Error inflating class android.widget.Button

请检查xml代码。

,

FragmentScenario 在隔离中测试您的片段,并且它也与其宿主活动隔离。这意味着,它不会启动您的主机活动,而是启动一个 EmptyFragmentActivity。因此,当您致电时:

getActivity().findViewById(R.id.planning_mode_layout)

它无法找到该视图,因为它不使用您的主机活动。

解决方案:您要么更改应用的结构以使片段独立于其宿主活动,要么不使用 FragmentScenario 测试此行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...