有 A 模块和 B 模块,俩模块中都负责比较复杂的逻辑,但都是我们自己实现且同事在职。 A 模块总是与 B 模块通过 tcp 通信,发一个 protobuf 并接一个 protobuf 。目前要测 A 的一个函数 f ,需要 B 在某种特定情况下(比如先开机,再翻转 360 度,再以 60km/h 弹射起步,最后以最小角度入水)才能模拟。
mock 一个模块 B ,简单实现一个内部逻辑,通过一些新增的函数去定制上面描述的特殊情况。
因为他俩通过 tcp 来通信,重写一个简单的 Send 函数,对于特定请求 request ,直接返回 response ,这样 A 每次调用 Send 都会收到事先写好的 response ,就可以直接处理。
方案 1 中的 mock B 可能需要和实际的 B 逻辑进行同步,好处是测试写起来更简单清晰,如果有新增测试只需要简单添加一个新的测试就行,坏处是自己本身的正确性无法保证。
方案 2 不需要在意实际 B 的更新,但缺点是测试可能会比较繁琐,需要人工模拟请求与返回(这里有个取巧的办法是将某个实际的请求与返回记录下来直接做成测试),后期几乎无法维护,只能新增。
模块 B 目前处于开发后期,功能暂时不会有新的,修复 bug 肯定会有。