Android 如何让浓缩咖啡等待firebase呼叫触发的活动?
我有一个Android 如何让浓缩咖啡等待firebase呼叫触发的活动?,android,firebase,firebase-realtime-database,android-espresso,Android,Firebase,Firebase Realtime Database,Android Espresso,我有一个LoginActivity,它使用firebase作为后端。成功登录后,我的main活动将成功显示 如何编写此活动变化的浓缩咖啡测试? 普通的方法是,浓缩咖啡跟踪当前的活动本身似乎只对不需要等待firebase的活动起作用。使用firebase auth时,我收到以下错误消息: android.support.test.espresso.NoMatchingViewException:在层次结构中找不到匹配的视图:id:(我的应用程序包):id/button2 (button2是新活动中
LoginActivity
,它使用firebase
作为后端。成功登录后,我的main活动
将成功显示
如何编写此活动变化的浓缩咖啡测试?
普通的方法是,浓缩咖啡跟踪当前的活动本身似乎只对不需要等待firebase的活动起作用。使用firebase auth时,我收到以下错误消息:
android.support.test.espresso.NoMatchingViewException:在层次结构中找不到匹配的视图:id:(我的应用程序包):id/button2
(button2是新活动中按钮的id,但无论我在新活动中尝试访问哪个视图,都会发生这种情况)
我也尝试过使用ActivityMonitor和类似的方法。它们似乎根本没有带来任何活动变化
Thread.sleep()
给人的印象与我想做的恰恰相反:它似乎暂停了应用程序,而不是测试本身
我知道我不应该测试firebase本身的功能,但我的应用程序在很大程度上依赖于正在登录的用户,我想稍后编写其他测试来测试已登录的用户的GUI
和功能
使用
firebaseauth
检查是否应触发活动时,如何为活动更改编写正确的浓缩咖啡测试?您需要使用IdlingResource类。Espresso无法判断用户界面何时正在等待Firebase等异步网络调用。IdlingResource就是为了这个目的而创建的。这里有一个方法可以解决你的问题
import android.support.test.espresso.IdlingResource
import com.myexample.MainActivity
class LoginIdlingResource constructor(
private val mainActivity: MainActivity
) : IdlingResource{
private var resourceCallback: IdlingResource.ResourceCallback? = null
override fun getName(): String {
return LoginIdlingResource::class.java.name
}
override fun isIdleNow(): Boolean {
return !mainActivity.isInProgress() // <----- Important part
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.resourceCallback = callback
}
}
@get:Rule
val mActivityTestRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
@Before
fun init() { IdlingRegistry.getInstance()
.register(RegisterIdlingResource(mActivityTestRule.activity))
}
导入android.support.test.espresso.IdlingResource
导入com.myexample.main活动
类LoginIdlingResource构造函数(
私有val mainActivity:mainActivity
):idlingsource{
私有变量resourceCallback:IdlingResource.resourceCallback?=null
重写fun getName():字符串{
return LoginIdlingResource::class.java.name
}
重写isIdleNow():布尔值{
return!mainActivity.isInProgress()//您可以将Firebase代码隐藏在接口后面,并提供模拟实现,该实现将立即返回进行浓缩咖啡测试。嗯,我希望避免模拟,但我想这是不可避免的。@AleksanderMielczarek是否愿意用您的解决方案给出答案?这将非常有帮助!