4

I am currently listening for Google Play services broadcasted action SmsRetriever.SMS_RETRIEVED_ACTION to check whether OTP SMS was retrieved. First, I start SmsRetriever:

SmsRetriever.getClient(context).startSmsUserConsent(null)

My BroadcastReceiver looks like this and works perfectly fine in real scenario:

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)
    }

}

I want to somehow mock this onReceive method, in order to test and verify that my onActivityResult code works as expected and autofills EditText with retrieved OTP.

  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)
     }
}

Any tips on how could I do that with Espresso and Mockito?

0 Answers0