单元测试调用已测子方法的目标方法时,是否应使用mock验证传参?
结论
这个场景非常适合用Mock验证子方法的入参正确性,是当前测试场景下的最优选择。
原因说明
- 你对
ValidateObject的单元测试目标本身就是验证它的流程控制逻辑,不需要重复验证已经完成测试的子方法内部逻辑。ValidateObject的核心逻辑就是根据TestEnum入参的取值、required入参的取值,决定调用哪些校验子方法、给子方法传递什么参数,刚好是Mock测试擅长验证的「对象行为是否符合预期」的场景。 - 用Mock做测试的优势非常明确:
- 测试用例更轻量:不需要构造满足子方法校验规则的复杂入参,也不用担心子方法内部抛出异常干扰当前测试的结果判定,只需要关注
ValidateObject本身的逻辑是否正确。 - 问题定位更精准:如果测试不通过,一定是
ValidateObject的分支判断逻辑、参数传递逻辑出了问题,不会和子方法的内部逻辑耦合,排查效率更高。
- 测试用例更轻量:不需要构造满足子方法校验规则的复杂入参,也不用担心子方法内部抛出异常干扰当前测试的结果判定,只需要关注
- 你需要覆盖的测试用例也非常清晰,刚好对应
ValidateObject的所有代码分支:- 入参
TestEnum等于TestEnum.A时,验证ValidateObjectPropertyA被调用,入参为待测对象的PropertyA属性和原始的required值;同时ValidateObjectPropertyB被调用,入参为待测对象的PropertyB属性和原始的required值。 - 入参
TestEnum等于TestEnum.C时,验证ValidateObjectPropertyC被调用,传入的required参数被修改为false。 - 入参
TestEnum为其他非A、非C的枚举值时,验证ValidateObjectPropertyC被调用,传入的required参数为原始入参值。
- 入参
补充提示
如果这三个校验子方法是当前类的成员方法,你可以把它们提取到独立的校验服务接口中,通过依赖注入的方式注入到当前类,就能很方便的替换为Mock对象完成测试。
内容的提问来源于stack exchange,提问作者JamesBV3
相关产品推荐
相关产品推荐

