没有解决任何活动的 Espresso 测试场景

时间:2021-02-11 21:35:54

标签: android android-intent android-espresso

我正在尝试测试未安装电子邮件应用的场景。因此,当我尝试使用 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)

0 个答案:

没有答案
相关问题