Android Kotlin: интеграционное тестирование, если текущее действие или приложение закрыто - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю над проектом Android Kotlin. Я пишу тесты интеграции / пользовательского интерфейса для моего приложения, используя тестовую среду Expresso. Я пытаюсь написать тест для сценария, в котором мое приложение закрыто или закрыто первое / основное действие, которое открыто в данный момент. Но это не работает.

См. Мой тестовый код ниже.

@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) является единственным открытым действием, оно завершит работу sh приложения. В классе активности он закрывается, используя метод fini sh (). Но когда я запустил тест, я получил следующую ошибку:

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 Ответ

0 голосов
/ 10 апреля 2020

Наконец-то я нашел решение. Вот оно.

Assert.assertTrue(eventListActivityRule.activity.isFinishing)

Это похоже на тестирование события нажатия кнопки возврата на панели действий.

...