我正在尝试测试未安装电子邮件应用的场景。因此,当我尝试使用 ACTION_SENDTO 解决意图的活动时,我不希望找到电子邮件活动并显示对话框,而不是打开 Gmail 应用程序。我如何嘲笑这个?
这是当我单击按钮发送电子邮件时将调用的方法:
private fun contactSupportByEmail() {
val supportEmail = "email@support.com"
val intent = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:")
putExtra(Intent.EXTRA_EMAIL, arrayOf(supportEmail))
}
if (intent.resolveActivity(requireContext().packageManager) != null) {
startActivity(intent)
} else {
showInfoDialog(requireContext(), "No Email App", "No email app installed")
}
}
这是我的测试:
@Test
fun noEmailAppInstalled_attemptToSendEmailToSupport_infoDialogDisplays() {
Intents.init()
intending(hasAction(Intent.ACTION_SENDTO)).respondWith(null)
onView(withText("Email")).perform(click())
onView(withText("No email app installed")).check(matches(isDisplayed()))
Intents.release()
}
这会在 startActivity() 处导致 NullPointerException,因为意图被设置为以 null 响应。如果我将预期操作设置为像这样成功响应:
intending(hasAction(Intent.ACTION_SENDTO)).respondWith(Instrumentation.ActivityResult(Activity.RESULT_OK, null))
然后我得到一个 NoMatchingViewException 因为对话框没有显示:
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131821101>[no_email_app] value: No email app found
本质上我需要 resolveActivity()
返回 null 所以我们陷入 else 块所以 showInfoDialog()
被调用。关于如何用 Espresso 做到这一点的任何想法?
NPE 的完整堆栈跟踪:
androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 870, 1301 and precision: 16, 16' on view 'with string from resource id: <2131821264>[support_option_email] value: Email'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:86)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:87)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:178)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:119)
at com.maithu.transplantbuddy.more_menu.MoreMenuFragmentUITest.clickEmailSupportOption_mockNoEmailAppInstalled(MoreMenuFragmentUITest.kt:68)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2251)
Caused by: java.lang.NullPointerException
at androidx.test.espresso.intent.Checks.checkNotNull(Checks.java:26)
at androidx.test.espresso.intent.OngoingStubbing.lambda$respondWith$0$OngoingStubbing(OngoingStubbing.java:42)
at androidx.test.espresso.intent.OngoingStubbing$$Lambda$0.apply(Unknown Source:2)
at androidx.test.espresso.intent.ResettingStubberImpl.getActivityResultForIntent(ResettingStubberImpl.java:89)
at androidx.test.runner.MonitoringInstrumentation.stubResultFor(MonitoringInstrumentation.java:646)
at androidx.test.runner.MonitoringInstrumentation.execStartActivity(MonitoringInstrumentation.java:531)
at android.app.Activity.startActivityForResult(Activity.java:5363)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234)
at androidx.fragment.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:790)
at androidx.fragment.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:932)
at androidx.fragment.app.Fragment.startActivity(Fragment.java:1258)
at androidx.fragment.app.Fragment.startActivity(Fragment.java:1246)
at com.maithu.transplantbuddy.more_menu.MoreMenuFragment.contactSupportByEmail(MoreMenuFragment.kt:130)
at com.maithu.transplantbuddy.more_menu.MoreMenuFragment.access$contactSupportByEmail(MoreMenuFragment.kt:31)
at com.maithu.transplantbuddy.more_menu.MoreMenuFragment$showSupportOptionsDialog$1.onClick(MoreMenuFragment.kt:106)
at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
at android.os.Handler.dispatchMessage(Handler.java:107)
at androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:148)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:525)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:484)
at androidx.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:236)
at androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:162)
at androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:139)
at androidx.test.espresso.action.Tap.sendSingleTap(Tap.java:170)
at androidx.test.espresso.action.Tap.access$100(Tap.java:31)
at androidx.test.espresso.action.Tap$1.sendTap(Tap.java:47)
at androidx.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:137)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:366)
at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:255)
at androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:65)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:158)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:155)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.Handler.handleCallback(Handler.java:888)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)