我正在使用 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)
当我使用实际设备手动测试时,一切都按预期工作。