如何写面向单测的代码

单元测试应该如何写

先上结论:

  • 不建议使用@Autowired直接属性注入,应使用构造器和setter方法注入

先抛出几个问题

  1. 按照应用的module划分模式,单测应该写在哪里?是每个module独立有自己的单测,还是在启动module中统一写单测?

  2. 单测时遇到的外部接口是否要采用mock的方式?

  3. 在Spring成为一种事实标准时,单测时一定要启动Spring容器吗? @Autowired的迷思?

简单来说下自己的思考

意图导向编程,测试用来表达接口设计契约
单测不是做测试,更是描述接口的职责

单测写在哪里主要是单测粒度的问题,每个module负责每个module的单测

单测时的外部依赖我们需要mock,减少我们对外部的依赖,保证程序的逻辑自治,外部依赖可替换

单测时一定要启动Spring容器吗,虽然Spring提供了很便利的测试工具,但每个测试都要启动容器,是不是带来了很多没必要的依赖,同时由于Autowired的便利性,我们可以很容易的将私有变量属性注入
这样就带来了一个问题,如果我们想要mock注入接口功能时,程序根本没有提供修改这个注入实例的方法
那为什么建议采用构造器注入呢,当我们想在这个类中增加功能时,这样可以思考下这个接口是不是应该在这个类中定义,会不会导致构造参数过多,而不是一味地增加私有属性变量