You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:54:07