0

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

我有三个活动,LoginActivity、RegisterActivity 和 HomeActivity。LoginActivity 使用 startActivityForResult 方法启动 RegisterActivity。然后在RegisterActivity中,注册完成后,使用finishActivity方法完成活动。所以调用了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)

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

4

1 回答 1

0

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

在LoginActivity 中,从您传入onActivityResult()的标志中提取标志(布尔值)并将该标志传递给用于启动. 签入并验证标志已通过,表明注册已完成。IntentRegisterActivityIntentHomeActivityIntentonCreate()HomeActivity

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

于 2019-10-21T00:14:54.513 回答