Firebase无密码登录单元测试报错:sendSignInLinkToEmail(...)不可为null
解决Firebase无密码登录单元测试的空指针异常问题
你的空指针异常核心来自两个问题:一是actionCodeSettings变量未初始化就传入方法,二是Mock配置代码的执行时机错误,且参数匹配逻辑不严谨。以下是具体修复方案:
1. 初始化ActionCodeSettings对象
测试代码中直接使用未定义的actionCodeSettings会导致传入null,触发空指针。先创建一个mock的实例:
val mockActionCodeSettings: ActionCodeSettings = mock()
2. 调整Mock配置的执行时机
你当前把whenever这类Mock配置写在类级别,会在setUp方法执行前运行,此时firebaseAuth还未被Mock初始化,必须把这些逻辑放到@Test注解的测试方法内部:
@Test fun sendSignInLink_Success_ReturnsSuccessResponse() { // Mock必要依赖 val taskVoid: Task<Void> = mock() val mockActionCodeSettings: ActionCodeSettings = mock() // 配置Mock行为 whenever(taskVoid.isSuccessful).thenReturn(true) whenever(firebaseAuth.sendSignInLinkToEmail(anyString(), any(ActionCodeSettings::class.java))) .thenReturn(taskVoid) // 执行测试方法 val result = passwordLessSignInRepo.sendSignInLink("example@gmail.com") // 断言结果 assertEquals(Response.SUCCESS, result.response) }
3. 使用Mockito参数匹配器(推荐)
如果你的PasswordLessSignInRepo内部是自行创建ActionCodeSettings实例,而非外部传入,硬编码参数会导致Mock匹配失败。用anyString()、any(ActionCodeSettings::class.java)这类匹配器,能确保无论Repo传入什么参数,Mock逻辑都会生效。
额外建议:如果Repo内部硬创建ActionCodeSettings,可以考虑把它改成依赖注入的方式(比如通过构造函数传入),这样测试时能更灵活地控制参数,提升测试的可靠性。
内容的提问来源于stack exchange,提问作者Rameez Khan
相关产品推荐
相关产品推荐

