Test support

The SDK makes it easy to write unit, integration, UI, or other types of automated tests in your code base. We designed our SDK with first-class support for automated testing, making it easy to inject dependencies and perform mocking in your code.

This page is part of a setup flow for the SDK. Before you continue, make sure you've implemented previous features—i.e. you can't receive in-app notifications before you identify people!

graph LR getting-started(Install SDK) -->B(Initialize SDK) B --> identify(identify people) identify -.-> track-events(Send events) identify -.-> push(Receive push) identify -.-> rich-push(Receive Rich Push) track-events --> test-support(Write tests) push --> test-support rich-push --> test-support identify -.-> in-app(Receive in-app) in-app --> test-support click getting-started href "/docs/sdk/android/getting-started/#install" click B href "/docs/sdk/android/getting-started/#initialize-the-sdk" click identify href "/docs/sdk/android/identify" click track-events href "/docs/sdk/android/track-events/" click register-token href "/docs/sdk/android/push" click push href "/docs/sdk/android/push" click rich-push href "/docs/sdk/android/rich-push" click in-app href "/docs/sdk/android/in-app" click test-support href "/docs/sdk/android/test-support" style test-support fill:#B5FFEF,stroke:#007069

Dependency injection

Every SDK class inherits from an interface. Inherited interfaces use a consistent naming convention: <NameOfClass>Instance. For example, the CustomerIO class inherits the protocol CustomerIOInstance.

If you want to inject a class in your project, it could look something like the example below.

class ProfileRepository(private val cio: CustomerIOInstance) {
    
    // Now, you can call any of the `CustomerIO` class functions with `this.cio`!
    suspend fun loginUser(email: String, password: String) {
        // Login the user to your system...

        // Then, identify the profile with Customer.io:
        cio.identify(email)
    }
}

val cio = CustomerIO.instance()
val repository = ProfileRepository(cio)

Mocking

Every SDK class inherits from an interface. Inherited interfaces use a consistent naming convention: <NameOfClass>Instance. For example, the CustomerIO class inherits the protocol CustomerIOInstance.

Interfaces are really easy to mock with mocking frameworks such as Mockito.

Here’s an example test class showing how you would test your ProfileRepository class.

class ProfileRepositoryTest {

    private val cioMock: CustomerIOInstance = mock()
    private lateinit var repository: ProfileRepository

    @Before 
    fun setUp() {
        repository = ProfileRepository(cioMock)
    }

    @Test 
    fun test_loginUser(): Unit = runBlocking {
        val givenEmail = "example@example.com"
        val givenPassword = "123"

        // Now, call your function under test:        
        repository.loginUser(givenEmail, givenPassword)

        // You can access many properties of the mock class to assert the behavior of the mock. 
        verify(cioMock, times(1)).identify(givenEmail, givenPassword)
    }
}
Copied to clipboard!
  Contents
Current release
 3.9.0
Is this page helpful?