UI test deep linking using Espresso in Android

test dependencies

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.1'

Deep linking test using ActivityTestRule and Espresso intented. The @Before and @After are required for each test. Initialize the intents before the test and release it afterwards. The intent is launched through the ActivityTestRule and verified by the Espresso intended.

import android.support.test.espresso.intent.Intents
import android.support.test.espresso.intent.Intents.intended
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent
import android.support.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import android.content.Intent
import android.net.Uri

@RunWith(AndroidJUnit4::class)
class DeepLinkingTest {

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

    @Before
    fun setUp() {
        Intents.init()
    }

    @After
    fun tearDown() {
        Intents.release()
    }

    @Test
    fun should_launch_secondActivity_when_deepLinkingToActivityTwo() {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("myapp://example.com?screen=activitytwo"))
        activityTestRule.launchActivity(intent)
        intended(hasComponent(SecondActivity::class.java!!.getName()))
    }

}

MainActivity.kt, the handleIntent() function will redirect to the appropriate place according to the data found in the intent.

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        handleIntent()
    }

    // adb shell am start -W -a android.intent.action.VIEW -d "myapp://example.com?screen=activitytwo" com.example.deeplinkinguitesting
    // adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/myapp?screen=activitytwo" com.example.deeplinkinguitesting
    private fun handleIntent() {
        val data = intent.data
        if (data == null) return

        val screen = data.getQueryParameter("screen")

        if (screen == "activitytwo") {
            startActivity(Intent(this, SecondActivity::class.java))
        }
    }

}

SecondActivity.kt

import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_two)
    }
}

The intent-filters for deep linking in the MainActivity configuration in the manifest file.


    
        
        
    

    
        
        
        
        
        
        
    

    
        
        
        
        
        
    



Complete example in Github

Search within Codexpedia

Custom Search

Search the entire web

Custom Search