spring项目单元测试初探1
之前在hcrm就专门花了很多时间去看如何写单元测试,但当时想通过他解决所有问题,直接保证质量。但单元测试并不能完全解决问题,可以解决一部分问题,而且受限于当时的场景,发现单元测试不解决不了太多问题,就没实际尝试。时隔3-4年又重新拿起来这个问题,但场景变了,环境变了,一些又那么理所当然,正好有人写了单元测试,我就趁机入门一下,发现原来也不难。
项目使用的是spring cloud这套东西,但首先要先弄清楚什么是单元测试,什么是集成测试,什么是端到端测试。单元测试应该不依赖其他系统,自己就可以快速的执行,马上得到结果。如果与数据库关联,与其他系统关联就是集成测试,需要准备其他的环境。第一个条件是定义,那第二个条件就是弄清楚项目的情况,比如我的项目都是spring boot的,那spring 的依赖注入如何解决,servlet容器如何解决,这是第二步看关联。
比如我之前就很迷惑,Aservice里注入Bservice,Bservice注入Cservice,Cservice里注入Dservice,那我要使用Aservice,要不断new B、C、Dservice这个好麻烦,如果有一些不熟悉的复杂的service那就头大了。一种方式就是将整个spring容器启动起来,这样就是所有bean都有,直接取注入或者取都行,但这样就不算单元测试了,启动容器要加载所有bean,可能会很慢,而且很多我并不需要,之前就是卡在这里没过去。最近看了别人写的代码,发现通过代理的方式很好的实现了,先将要代理的对象注入,启动的时候自动代理这些对象,将要执行的方法的返回值,提前输入,等到触发代理条件,自动返回,这样就不用去实际创建这些对象,理解了这个用途,突然觉得代理强大,这个地方用的恰如其分。
然后我写了一些业务代码,去stub这些service也有些烦,mockito不支持私有方法stub,需要找到公开的方法一点带你的mock,这点有点烦,也许是我用法不对,而且一些看起来很简单的判断逻辑要想每种条件都测试,也是很麻烦的事情。
这次算是单元测试入门,什么事情都是入门难,先快速入门,其他都好办了。