【问题标题】:Android Instrumented testing if the activity is opened via the onActivityResult callbackAndroid Instrumented 测试是否通过 onActivityResult 回调打开活动
【发布时间】:2019-10-20 23:26:59
【问题描述】:

我正在使用 Kotlin 开发一个 Android 应用程序。我正在为我的代码编写仪器测试。现在我正在努力为特定功能编写仪器测试。以下是我要为其编写测试的场景。

我有三个活动,LoginActivity、RegisterActivity 和 HomeActivity。 LoginActivity 使用 startActivityForResult 方法启动 RegisterActivity。然后在RegisterActivity中,注册完成后,使用finishActivity方法完成Activity。所以调用了LoginActivity类的onActivityResult回调。在 onActivityResult 中,它使用 startActivity 方法启动 HomeActivity。

那么,当在RegisterActivity中完成注册时,如何测试HomeActivity是否在LoginActivity的onActivityResult回调中启动?

这是我目前不完整的代码,试图测试该特定功能

@RunWith(AndroidJUnit4::class)
class RegisterFormTest
{
    @Rule @JvmField
    val registerActivityRule: ActivityTestRule<RegisterActivity> = ActivityTestRule<RegisterActivity>(RegisterActivity::class.java)

    @Before
    fun setUp() {
    }

    @Test fun registerFormStartsHomeActivityAfterLogin() {
        Intents.init()
        FakeAuthService.SCENARIO_UNDER_TEST = FakeAuthService.SCENARIO_REGISTER_SUCCESSFUL

        onView(withId(R.id.register_button_submit)).perform(click())

        val accessToken = (registerActivityRule.activity.application as MockApplicationController).getLocalStorage()?.getString(ApplicationController.PREF_KEY_ACCESS_TOKEN, "")
        Assert.assertEquals(FakeAuthService.FAKE_ACCESS_TOKEN, accessToken)

        Thread.sleep(1000)


    Intents.intended(IntentMatchers.hasComponent(HomeActivity::class.java.name))

    Intents.release()

    }
}

但是上面的测试不起作用。它失败。如何正确测试我的场景?

这就是我在 RegisterActivity 类中完成活动的方式

setResult(Activity.RESULT_OK)
finish()

这是 LoginActivity 类中的 onActivityResult 回调

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == RegisterActivity.ACTIVITY_CODE && resultCode == Activity.RESULT_OK) {
            startHomeActivity()
        }
    }

这是错误

2019-10-21 14:51:08.642 25433-25461/com.example.memento E/TestRunner: ----- 开始异常 ----- 2019-10-21 14:51:08.642 25433-25461/com.example.memento E/TestRunner: junit.framework.AssertionFailedError: 想要匹配 1 个意图。实际上匹配了 0 个意图。

IntentMatcher: has component: has component with: class name: is "com.example.myapp.HomeActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String

Matched intents:[]

Recorded intents:[]
    at junit.framework.Assert.fail(Assert.java:50)
    at androidx.test.espresso.intent.VerificationModes$Times.verify(VerificationModes.java:80)
    at androidx.test.espresso.intent.Intents.internalIntended(Intents.java:346)

当我使用实际设备手动测试时,一切都按预期工作。

【问题讨论】:

    标签: android kotlin instrumented-test


    【解决方案1】:

    考虑在RegisterActivity 中设置一个结果,在Intent 中传递一个标志,并在setResult(OK,Intent) 中传递IntentIntent 将包含指示注册已完成的标志。

    在 LoginActivity 的 onActivityResult() 中,从您传入 RegisterActivityIntent 中提取标志(布尔值)并将该标志传递到用于启动 HomeActivityIntent 中。检查onCreate()HomeActivity 中的Intent 并验证标志已通过,表明注册已完成。

    如果收到该标志,请将 TextView 的值设置为您选择的某个随机字符串,然后使用 espresso 匹配器检查该 TextView 的文本是否与您的随机字符串匹配。

    【讨论】:

    • 嗨@Jarvis,我刚刚更新了添加更多代码sn-ps的问题。能再看一遍吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2022-01-11
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多