gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:25:44 25 4
gpt4 key购买 nike

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

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 创建一个新对象。对于单元测试中已验证的方法,它们将不相同
log(AnalyticEvent.UserId(cdsCustomer.id.toString()))作为新的 AnaltyicEvent.UserId将被创建并且只是为了相同的 AnalyticProvider mock
非常感谢您的任何建议

最佳答案

the documentationArgumentCaptor我们可以读到:

This utility class doesn't do any type checks. The genericsignatures are only there to avoid casting in your code.


此外 捕获匹配器 用于收集捕获的参数有一个匹配所有对象的方法:
public boolean matches(Object argument) {
return true;
}
这意味着这是正常行为,即使我们指定具体类型的捕获器,它也会记录所有传递的参数。
当然,所有这些参数都必须继承自同一个基类,因为在其他情况下 capture方法会导致编译错误。
所以,你的两个俘虏都记录了两个论点。
要为您的测试修复类转换异常,您可以断言 秒值 用于电子邮件。
assertThat(userEmailCapture.secondValue.email).isEqualTo(cdsCustomer.email) 
您也可以停止使用参数捕获器并简单地验证 log 的调用。方法。
verify(analyticsProviders).log(AnalyticEvent.UserId(cdsCustomer.id.toString()))
verify(analyticsProviders).log(AnalyticEvent.UserEmail(cdsCustomer.email))

关于android - 使用捕获和模拟对类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68420223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com