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