【问题标题】:Unit test stops after addOnCompleteListener of the Firebase Task APIFirebase 任务 API 的 addOnCompleteListener 后单元测试停止
【发布时间】:2018-03-06 10:25:24
【问题描述】:

我已经为我的应用实现了我的第一个测试用例。在每个测试用例之前,我需要使用 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
    }
}

【问题讨论】:

    标签: firebase firebase-realtime-database google-tasks-api android-junit


    【解决方案1】:

    您可以use Tasks.await() to block the current thread 等待任务完成。非常不建议将这用于应用程序代码(在this blog 中了解更多信息),但对于测试应该没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多