有位同事特别喜欢用 mock,测试一个 service 的时候会把所有外部依赖都用 mock 写,以此隔离测试代码。他的理由有,service A 依赖 service B,在 A 的单测中如果直接调用 B 来准备测试数据,那么 B 在后面的时候可能会不断增长,然后引入很多和 A 无关的东西,也可能 break A 的测试。而如果用 mock 的话,A 的测试是不需要改的,写测试的时候关注点也只会在 A 内部。但是我认为如果这么干,会需要一些额外的代码来测 A 对 B 的依赖,不然不能保证 B 的运行结果和最初的 mock 数据是一样的,这实际上增加了测试的代码量,而且测试本来应该是为了发现问题,而不是作为“不会有问题”的代码,如果用维护业务代码的方式维护测试,似乎就失去了测试的意义。
我想了一种折中方案,就是通过实际调用 service 来准备数据,然后把这些数据 dump 一份,保存来用作 mock,这样 service 改变这个 dump 也不会变,可以很好地满足他想要隔离测试的想法。然后可以监视一个 service 生成的新的 dump 和以往的 dump 是不是有不同,如果有不同,就更新一下 dump 的版本看看单元测试还能不能过。这样如果 dump 更新得勤,就能实现我想要的发现问题。这样好像是不错的,可以实际观测到 service 改动所产生的效应,不过可能需要造一些轮子。