编写单元测试相关
工作中需要给接口编写单元测试,增加单测覆盖率,涉及到测试环境的搭建,如 Mock、Fake 等,稍作记录。
入门单元测试编写的一些总结
本文主要参考
写单测的时候发现别人写的模拟测试环境的代码有点看不懂,看了测试规范还是有点懵逼,于是读了一些博客,简单梳理了一下。
模拟外部服务, Mock、Fake、Stub
其实模拟的目的简单,就是我们测试的对象 A,运行当中多少需要依赖一些外部的服务、对象和数据库,本地单测环境下里没法构建这些完整的服务,于是需要在本地模拟这些对象和服务的实现。
模拟的方法也很简单,
- 对于你需要调用的外部服务,自己写一个预设好的返回值(保证调用时返回确定的结果)。这就是一个 Mock。
- 如果需要调用一个外部对象比较完整的功能,那么干脆使用一个新的实现,可以基本模拟该对象的大部分行为,也能方便其他测试复用。这就是一个 Fake。
- 对于需要访问数据库等情况,在内存中建立一个虚拟的数据库交互对象,插入一些预设好的数据,以供访问数据的接口进行增删改查,这就是一个 Stub。
Mock
借助 Mockito 静态类实现一个类似
1 | Mockito.when(${调用方法}).then(${希望行为,比如一些返回值}) |
的调用即可。
主要注意两种特殊的模拟注解
@SpyBean
对于没有配置 Mock 模拟的其他服务,会加载正常的实现类(类似 @AutoWire 的表现)去调用真实的方法。
@MockBean
对于没有配置 Mock 模拟的其他服务,会返回 null。
Fake
项目中提供了许多 FakeXXX 的对象,比较完整地模拟 Proxy 的对象行为。可以直接调用作为外部对象。
Stub
构造了 DBClient 和 JedisClient 对象,模拟与 MySQL 数据库和 Redis 数据库的交互。使用时自行插入假数据即可。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.