使用@GenerateNiceMocks生成Mock失败:私有参数类型无法存根
解决Mockito生成Mock时私有类型属性的问题
问题原因
你遇到的错误是因为CLASSTOMOCK中的classVariable属性对应的setter(classVariable=)涉及私有类_ANOTHERCLASS,Mockito无法为私有类型的成员生成有效的存根逻辑。
解决方案
1. 正确配置MockSpec的unsupportedMembers
确保你准确指定了要忽略的成员名称(注意是setter的完整名称classVariable=,而非属性名):
import 'package:mockito/mockito.dart'; import 'package:mockito/annotations.dart'; class CLASSTOMOCK { late final _ANOTHERCLASS classVariable; CLASSTOMOCK(){ classVariable = _ANOTHERCLASS(); } } class _ANOTHERCLASS {} @GenerateNiceMocks([ MockSpec<CLASSTOMOCK>( // 明确忽略私有类型的setter成员 unsupportedMembers: {'classVariable='}, ) ]) void main() {}
运行代码生成命令后,Mockito会跳过对该成员的存根生成,避免报错。
2. 使用dummyGenerator生成基础实例
如果unsupportedMembers仍不生效,可以让Mockito直接使用原类的实例作为mock的基础实现:
@GenerateNiceMocks([ MockSpec<CLASSTOMOCK>( dummyGenerator: (type) => CLASSTOMOCK(), ) ])
这种方式下,mock类会复用原类中classVariable的初始化逻辑,绕过私有类型的存根问题。
3. 重构原类(推荐)
从测试友好性角度,建议重构CLASSTOMOCK,通过依赖注入暴露classVariable的初始化逻辑,这样无需依赖Mockito的特殊配置:
class CLASSTOMOCK { final _ANOTHERCLASS classVariable; // 可选参数注入,保留原有默认行为的同时支持外部传入实例 CLASSTOMOCK([_ANOTHERCLASS? classVar]) : classVariable = classVar ?? _ANOTHERCLASS(); }
重构后,你可以直接在测试中传入_ANOTHERCLASS的mock(如果需要),或者使用原类实例,Mockito生成mock时也不会再遇到私有类型的问题。
内容的提问来源于stack exchange,提问作者Darshan Popat
相关产品推荐
相关产品推荐

