mocktail单元测试运行通过,但抛出Null非Future<>子类型运行时异常
异常原因解释
这个问题是mocktail 0.1.4及更早版本的内部实现机制导致的,属于调试阶段可忽略的预期内异常,具体触发逻辑如下:
- 老版本mocktail的
when()API在注册方法桩时,会先主动执行一次你传入的方法调用回调(也就是示例中() => authenticationRepository.activeToken()这部分),用来捕获本次调用的方法签名、入参信息,作为后续匹配真实调用的依据。 - 这次预执行发生在
thenAnswer()注册返回值之前,此时Mock类的activeToken()方法还没有任何桩实现,默认返回null。 - 但
activeToken()的方法签名规定返回类型为Future<AuthenticationToken?>,null不属于Future类型,因此直接触发你看到的类型错误异常。 - 该异常会被mocktail内部自动捕获处理,不会向外抛出影响后续测试逻辑:当你跳过异常后,桩逻辑已经完成注册,后续实际调用
activeToken()时会返回你设置的正确值,因此测试可以正常通过。只有开启VS Code的All Exceptions调试时,调试器会捕获到这个还没被mocktail吞掉的内部异常,才会断住。
解决方式
你可以根据自己的需求选择任意一种处理方案:
- 升级mocktail到0.2.0及以上版本,新版本优化了
when()的实现逻辑,不再通过主动预执行方法的方式捕获调用信息,不会再触发该异常。 - 无需修改代码,调试时遇到该异常直接跳过即可,完全不会影响测试结果的正确性。
- 不想升级也不想每次手动跳过的话,可以在VS Code的调试配置中添加异常过滤规则,忽略mocktail包抛出的异常。
内容的提问来源于stack exchange,提问作者davejlin
相关产品推荐
相关产品推荐

