我正在使用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框架?
答案 0 :(得分:1)
您可以使用Intents.intended()。
将以下内容添加到您的 build.gradle 文件中:
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
在测试功能中,您可以尝试以下代码:
Intents.init()
Intents.intended(hasComponent(LoginActivity::class.java!!.getName()))
您可以阅读有关意式浓缩咖啡here的更多信息。
答案 1 :(得分:1)
最好通过单元测试来测试此状态。使用架构模式(例如MVP / MVVM),模拟演示者/视图模型并检查触发了负责活动开始的哪种方法
答案 2 :(得分:0)
您可以使用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")
}
}
}