Android Kotlin:如果当前活动或应用程序关闭,则进行集成测试

Posted

技术标签:

【中文标题】Android Kotlin:如果当前活动或应用程序关闭,则进行集成测试【英文标题】:Android Kotlin: Integration testing if the current activity or app is closed 【发布时间】:2020-04-10 06:02:37 【问题描述】:

我正在开发一个 android Kotlin 项目。我正在使用 Expresso 测试框架为我的应用程序编写集成/ UI 测试。我正在尝试为我的应用程序关闭或当前打开的第一个/主要活动已关闭的场景编写测试。但它不起作用。

在下面查看我的测试代码。

@RunWith(AndroidJUnit4::class)
@LargeTest
class EventListTest: TestBuilder()

    @get:Rule
    val eventListActivityRule: ActivityTestRule<EventListActivity> = ActivityTestRule<EventListActivity>(EventListActivity::class.java, true, false)

    @Test
    fun itFinishesActivityWhenLogoutMenuItemIsTapped() 
        FakeEventService.SCENARIO_UNDER_TEST = 0
        this.eventListActivityRule.launchActivity(null)
        Intents.init()
        openActionBarOverflowOrOptionsMenu(ApplicationProvider.getApplicationContext<Context>())
        onView(withText(eventListActivityRule.activity.resources.getString(R.string.menu_item_logout))).perform(click())

        intended(not(hasComponent(EventListActivity::class.java.name)))
        Intents.release()
    


基本上,我正在测试它是否在单击注销菜单项时关闭当前活动。由于当前活动 (EventListActiivty) 是唯一打开的活动,因此它将完成应用程序。在活动类中,它使用 finish() 方法自行关闭。但是当我运行测试时,我得到了以下错误。

W/example.mement: Accessing hidden field Landroid/app/Activity;->mResultCode:I (light greylist, reflection)
W/example.mement: Accessing hidden field Landroid/app/Activity;->mResultData:Landroid/content/Intent; (light greylist, reflection)
E/TestRunner: failed: itFinishesActivityWhenLogoutMenuItemIsTapped(com.example.memento.EventListTest)
E/TestRunner: ----- begin exception -----
E/TestRunner: junit.framework.AssertionFailedError: Wanted to match 1 intents. Actually matched 0 intents.

    IntentMatcher: not has component: has component with: class name: is "com.example.memento.EventListActivity" 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)
        at androidx.test.espresso.intent.Intents$3.run(Intents.java:204)
        at androidx.test.espresso.intent.Intents$PropogatingRunnable.run(Intents.java:224)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2163)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/TestRunner: ----- end exception -----
I/TestRunner: finished: itFinishesActivityWhenLogoutMenuItemIsTapped(com.example.memento.EventListTest)

如何测试这种情况以及如何修复我的代码?

我也用过这个。

Assert.assertTrue(eventListActivityRule.activity.isDestroyed)

但它也不起作用。

【问题讨论】:

【参考方案1】:

最后,我找到了解决方案。在这里。

Assert.assertTrue(eventListActivityRule.activity.isFinishing)

类似于测试操作栏后退按钮按下事件。

【讨论】:

以上是关于Android Kotlin:如果当前活动或应用程序关闭,则进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

如何根据 android studio 中的 listview 项目点击更改活动图像和文本? java 或 kotlin

Android 中的 Firebase 通知 (Kotlin)

Android 防重复点击(Kotlin 协程实现 和 Handler实现)

Android 防重复点击(Kotlin 协程实现 和 Handler实现)

Android 防重复点击(Kotlin 协程实现 和 Handler实现)