Google Mock合法用法探讨:测试同类成员函数是否有效?
解答
1. 你的测试是有效的,确实验证了RealClass::A()的核心逻辑
因为MockClass继承自RealClass且未重写A()方法,调用myMockClass.A()时,执行的完全是RealClass中A()的原生代码——也就是返回B()的结果。你通过MockB()固定返回5,本质是在隔离A()对B()的依赖,专注测试A()是否正确调用B()并返回其值,这是单元测试中隔离依赖、聚焦单一逻辑的标准做法,完全合理。
2. 这种测试方式的隐患有限,需注意两点
- 确认
A()无其他未被隔离的依赖:如果A()除了调用B(),还依赖RealClass中的非虚私有方法或成员变量,而Mock类未维持这些状态的正确性,测试结果可能失真。但你的示例中A()逻辑极简,不存在这个问题。 - 按需Mock,避免过度:如果
B()本身逻辑简单(比如示例中仅返回5),直接用真实RealClass测试更简洁。但如果B()是重计算、依赖外部资源(如数据库)或不稳定的逻辑,Mock它能大幅提升测试速度和稳定性,此时Mock的价值极大。
3. 并非必须使用真实的RealClass对象
两种测试方式各有适用场景:
- Mock对象测试:适合隔离依赖,聚焦
A()自身的逻辑(即是否正确调用依赖方法并处理返回值),尤其适用于依赖方法执行成本高、难以模拟输入的场景。 - 真实对象测试:适合做集成验证,确认
A()与真实B()协同工作的整体逻辑是否正确,比如验证B()的真实计算结果能被A()正确返回。
如果你的目标仅为验证A()本身的逻辑,Mock方式完全足够;若需验证A()与真实B()的协作,才需要使用真实对象。
内容的提问来源于stack exchange,提问作者Mikeagain1
相关产品推荐
相关产品推荐

