使用捕获和模拟对类进行单元测试

我正在尝试对以下类进行单元测试:

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

这是我的单元测试:

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

我得到的错误如下:

AnalyticEvent$UserId cannot be cast to AnalyticEvent$UserEmail

我怀疑是因为被测类正在为每个类创建一个新对象 log方法所以它们对于单元测试中已验证的方法不会相同

IE log(AnalyticEvent.UserId(cdsCustomer.id.toString()))

作为一个新的AnaltyicEvent.UserId将被创建并且只是为了同一个AnalyticProvider模拟

非常感谢您的任何建议

以上是使用捕获和模拟对类进行单元测试的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>