Kotlin中NewCreditCardValidation测试时cardNumber等返回null如何处理
问题解决步骤
问题根源
你初始化NewCreditCardValidation实例时,cardNumber和termsAndCondition两个字段使用了默认值null,后续你用安全调用符?.对这两个字段做的赋值、属性修改操作,都会因为字段本身为null直接跳过执行,因此两个字段始终为null,校验逻辑自然无法通过。
修复方案
你需要先Mock这两个Android控件类的实例,再赋值给数据类的对应字段,同时配置Mock的返回行为符合校验要求,修改后的测试代码如下:
@RunWith(MockitoJUnitRunner::class) class NewCreditCardValidationTest{ // 先Mock两个控件实例 @Mock lateinit var mockCardNumber: MasterPassEditText @Mock lateinit var mockTermsButton: CompoundButton private val newCardValidation = NewCreditCardValidation() @Test fun `Check cardValidation is valid`(){ // 把Mock实例赋值给对应字段,替换默认null newCardValidation.cardNumber = mockCardNumber newCardValidation.termsAndCondition = mockTermsButton // 配置Mock的行为,符合校验通过条件 Mockito.`when`(mockCardNumber.isEmpty).thenReturn(false) Mockito.`when`(mockTermsButton.isChecked).thenReturn(true) // 其余字段赋值保留 newCardValidation.cardMonth = 10 newCardValidation.cardYear = 2023 newCardValidation.cardName = "mycard" Truth.assertThat(newCardValidation.isValid).isTrue() } }
可选优化
如果需要模拟真实输入卡号的场景,也可以额外配置mockCardNumber的getText行为,和你的原有逻辑对齐:
Mockito.`when`(mockCardNumber.text).thenReturn("4111111111111111")
内容的提问来源于stack exchange,提问作者Ahmet Yilmaz
相关产品推荐
相关产品推荐

