Monday, 19 July 2021

Using capture and mocks to unit test a class

I am trying to unit test the following class:

class UserProfileDetailsAnalyticUseCaseImp @Inject constructor(private val analyticsProvider: AnalyticsProvider) : UserProfileDetailsAnalyticUseCase {
    override fun execute(cdsCustomer: CDSCustomer) {
        with(analyticsProvider) {
            log(AnalyticEvent.UserId(cdsCustomer.id.toString()))
            log(AnalyticEvent.UserEmail(cdsCustomer.email))
        }
    }
}

And this is my unit test:

class UserProfileDetailsAnalyticUseCaseImpTest {

    private lateinit var userProfileDetailsAnalyticUseCaseImp: UserProfileDetailsAnalyticUseCaseImp
    private val analyticsProviders: AnalyticsProvider = mock()


    @Before
    fun setUp() {
        userProfileDetailsAnalyticUseCaseImp = UserProfileDetailsAnalyticUseCaseImp(analyticsProviders)
    }

    @Test
    fun `should send analytic event`() {
        // Arrange
        val cdsCustomer = CDSCustomer(
            id = Random.nextInt(0, 100000),
            email = UUID.randomUUID().toString())

        val userIdCapture= argumentCaptor<AnalyticEvent.UserId>()
        val userEmailCapture= argumentCaptor<AnalyticEvent.UserEmail>()

        // Act
        userProfileDetailsAnalyticUseCaseImp.execute(cdsCustomer)

        // Assert
        verify(analyticsProviders, atLeastOnce()).log(userIdCapture.capture())
        verify(analyticsProviders, atLeastOnce()).log(userEmailCapture.capture())
    
        assertThat(userIdCapture.firstValue.userId).isEqualTo(cdsCustomer.id.toString())
        assertThat(userEmailCapture.firstValue.email).isEqualTo(cdsCustomer.email)
    }
}

The error I get is the following:

AnalyticEvent$UserId cannot be cast to AnalyticEvent$UserEmail

I am suspecting that because class under test is creating a new object for each log method they will not be the same for the verified methods in the unit test

i.e log(AnalyticEvent.UserId(cdsCustomer.id.toString()))

As a new AnaltyicEvent.UserId will be created and just for the same AnalyticProvider mock

Many thanks for any suggetions



from Using capture and mocks to unit test a class

No comments:

Post a Comment