我目前正在收听 Google Play 服务广播的操作 SmsRetriever.SMS_RETRIEVED_ACTION 以检查是否检索到 OTP SMS。首先,我启动 SmsRetriever:
SmsRetriever.getClient(context).startSmsUserConsent(null)
我的 BroadcastReceiver 看起来像这样,在实际场景中工作得非常好:
object : BroadcastReceiver() {
override fun onReceive(
context: Context,
intent: Intent
) {
try {
if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
val extras = intent.extras
val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as? Status
when (smsRetrieverStatus?.statusCode) {
CommonStatusCodes.SUCCESS -> {
extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)?.let {
myOtpFragment.startActivityForResult(it, SMS_REQUEST_CODE)
}
}
}
}
} catch (e: Exception) {
Timber.e(e)
}
}
我想以某种方式模拟这个 onReceive 方法,以测试和验证我的 onActivityResult 代码是否按预期工作,并使用检索到的 OTP 自动填充 EditText。
override fun onActivityResult(
requestCode: Int,
resultCode: Int,
data: Intent?
) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == SMS_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val otp = data?.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE) ?: ""
et_otp?.let {
it.setText(otp)
adjustOtpSelection(it)
}
}
关于如何使用 Espresso 和 Mockito 做到这一点的任何提示?