在Firebase任务API的addOnCompleteListener之后,单元测试停止

在Firebase任务API的addOnCompleteListener之后,单元测试停止,firebase,firebase-realtime-database,google-tasks-api,android-junit,Firebase,Firebase Realtime Database,Google Tasks Api,Android Junit,我已经为我的应用程序实现了我的第一个测试用例。在每个测试用例之前,我需要使用Firebase登录 我已经使用Tasks API对Firebase类中的所有内容进行了编程。Firebase类是异步的,但会发回一个任务,并且可以使用addOnCompleteListener读取结果。但是,在登录logUserIn()之后,测试将停止,并且“someNumber”无法打印。我不能将logUserIn()方法放在@Before方法中,因为它是异步的 @RunWith(AndroidJUnit4::cla

我已经为我的应用程序实现了我的第一个测试用例。在每个测试用例之前,我需要使用Firebase登录

我已经使用Tasks API对Firebase类中的所有内容进行了编程。Firebase类是异步的,但会发回一个任务,并且可以使用addOnCompleteListener读取结果。但是,在登录logUserIn()之后,测试将停止,并且“someNumber”无法打印。我不能将logUserIn()方法放在@Before方法中,因为它是异步的

@RunWith(AndroidJUnit4::class)
class NetworthServiceTest {

    @Rule
    @JvmField
    val rule = ActivityTestRule(MainActivity::class.java)

    private fun logUserIn(): Task<Boolean> {
        val tcs = TaskCompletionSource<Boolean>()

        val task = FirebaseService().initialize(
                TEST_USER_EMAIL,
                TEST_USER_PASSWORD,
                rule.activity)

        task.addOnCompleteListener {
            Assert.assertEquals("User " + TEST_USER_EMAIL + " cannot be logged in", "", it.result.second)

            val loginManager = UtilsProvider().getBookyLoginManager()
            Assert.assertEquals("User should be logged in", true, loginManager.isLoggedIn())

            tcs.setResult(true)
        }

        return tcs.task
    }

    @Test
    @Throws(Exception::class)
    fun whenReadingTableShouldGive10Results() {
        val task = logUserIn()
        task.addOnCompleteListener {
            val someNumber = 10
            Log.d("","print nr = "+ someNumber)
        }
    }
}


class FirebaseService {

    fun initialize(email: String, password: String, activity: Activity): Task<Pair<Any, String>> {
        database = FirebaseDatabase.getInstance().reference
        auth = FirebaseAuth.getInstance()

        val tcs = TaskCompletionSource<Pair<Any, String>>()

        auth!!.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(activity) { task ->
                    if (task.isSuccessful) {
                        user = auth!!.currentUser
                        isInitialized = true
                        val pair = Pair<Any, String>(null, "")
                        tcs.setResult(pair)
                    } else {
                        val pair = Pair<Any, String>(null, "error: " + task.exception!!.message)
                        tcs.setResult(pair)
                    }
                }
        return tcs.task
    }
}
@RunWith(AndroidJUnit4::class)
类NetworthServiceTest{
@统治
@JvmField
val rule=ActivityTestRule(MainActivity::class.java)
private fun logUserIn():任务{
val tcs=TaskCompletionSource()
val任务=FirebaseService()。初始化(
测试用户电子邮件,
测试用户密码,
规则(活动)
task.addOnCompleteListener{
Assert.assertEquals(“用户”+测试用户”\u电子邮件+“无法登录”,“”,it.result.second)
val loginManager=UtilsProvider().getBookyLoginManager()
Assert.assertEquals(“用户应登录”,true,loginManager.isLoggedIn())
tcs.setResult(真)
}
返回tcs.task
}
@试验
@抛出(异常::类)
当AdingTable应该给出10个结果时的乐趣(){
val task=logUserIn()
task.addOnCompleteListener{
val someNumber=10
Log.d(“,”打印编号=“+someNumber”)
}
}
}
类别FirebaseService{
乐趣初始化(电子邮件:字符串,密码:字符串,活动:活动):任务{
database=FirebaseDatabase.getInstance().reference
auth=FirebaseAuth.getInstance()
val tcs=TaskCompletionSource()
auth!!.使用电子邮件和密码登录(电子邮件,密码)
.addOnCompleteListener(活动){task->
如果(任务成功){
user=auth!!.currentUser
isInitialized=true
val对=对(空,“”)
tcs.setResult(对)
}否则{
val pair=pair(null,“错误:+task.exception!!.message”)
tcs.setResult(对)
}
}
返回tcs.task
}
}
您可以等待任务完成。对于应用程序代码,这是非常不推荐的(请阅读中的更多信息),但对于测试来说应该是可以的