kotlin Android Instrumented测试AssertActivity是否已启动

oewdyzsn  于 2022-12-04  发布在  Kotlin
关注(0)|答案(4)|浏览(178)

我正在使用Kotlin编程语言开发一个Android应用程序。我正在向我的应用程序中添加插装测试。现在我正在尝试测试活动是否在一些延迟后启动。
这是我的活动代码。

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框架来做这件事?

xxe27gdn

xxe27gdn1#

您可以使用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")
        }
    }
}
2uluyalo

2uluyalo2#

您可以使用Intents.intended()来实现这一点。
将以下内容添加到您的build.gradle文件:

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

在测试函数中,可以尝试以下代码:

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

您可以阅读更多关于Espresso-Intents here的信息。

inb24sb2

inb24sb23#

最好使用单元测试来测试这种状态。使用体系结构模式(例如MVP/MVVM),模拟演示者/视图模型,并检查触发了负责活动启动的方法

mutmk8jj

mutmk8jj4#

我使用以下代码使其工作:

val expectedUrl = "https://yoururlhere"    
Intents.init();
Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_VIEW), hasData(expectedUrl));
intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
onView(withId(R.id.someViewId)).perform(click());
intended(expectedIntent);
Intents.release();

请记住将“androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'”添加到您的Gradle依赖项中

相关问题