Android-инструментальное тестирование, проверяющее, запущено ли действие - PullRequest
1 голос
/ 22 сентября 2019

Я разрабатываю приложение для Android с использованием языка программирования Kotlin.Я добавляю измерительные тесты в свое приложение.Теперь я пытаюсь проверить, запускается ли действие после некоторой задержки.

Это мой код активности.

class MainActivity : AppCompatActivity() {

    companion object {
        val LAUNCH_DELAY: Long = 2000
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Handler().postDelayed({
            this.startLoginActivity()
        }, LAUNCH_DELAY)
    }

    protected fun startLoginActivity()
    {
        startActivity(Intent(this, LoginActivity::class.java))
    }
}

Я знаю, как написать простой тест, подобный этому

@Test
fun itRendersCompanyName() {
    onView(withId(R.id.main_tv_company_name)).check(matches(withText("App Name")))
}

Но что я пытаюсь проверить здесь, так это как я могу проверить, запускается ли LoginActivity после некоторой задержки, пожалуйста?Как я могу сделать это с помощью фреймворка Espresso?

Ответы [ 3 ]

1 голос
/ 22 сентября 2019

Для этого вы можете использовать Intents.intended () .

Добавьте следующее в ваш build.gradle файл:

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'

В своей тестовой функции вы можете попробовать следующий код:

Intents.init()
Intents.intended(hasComponent(LoginActivity::class.java!!.getName()))

Вы можете узнать больше о Espresso-Intents здесь .

0 голосов
/ 22 сентября 2019

Вы можете получить видимое действие, используя ActivityManager:

inline fun <reified T : Activity> isVisible(): Boolean {
    val am = ApplicationProvider.getApplicationContext<Context>().getSystemService(ACTIVITY_SERVICE)
            as ActivityManager

    val visibleActivityName = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        am.appTasks[0].taskInfo.topActivity.className
    } else {
        am.getRunningTasks(1)[0].topActivity.className
    }
    return visibleActivityName == T::class.java.name
}

Вызов isVisible<LoginActivity>() скажет вам, что LoginActivity является видимым или нет.

Кроме того, чтобы подождать, покаваш LoginActivity видимый, вы можете подождать, пока этот метод получит true.Например:

inline fun <reified T : Activity> waitUntilActivityVisible() {
    val startTime = System.currentTimeMillis()
    while (!isVisible<T>()) {
        Thread.sleep(200)
        if (System.currentTimeMillis() - startTime >= TIMEOUT) {
            throw AssertionError("Condition unsatisfied after $TIMEOUT milliseconds")
        }
    }
}
0 голосов
/ 22 сентября 2019

Лучше проверить это состояние с помощью модульных тестов.Используйте шаблон архитектуры (например, MVP / MVVM), макет модели презентатора / представления и проверьте, какой метод, который отвечает за запуск операции, запускается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...