Mock数据库
单元测试的重要性就很少说了,我这边的工程通常都是Spring Boot+Mybatis(详情可参看《Spring boot+MyBatis+PageHelper+JSON》),如今写一下Spring Boot下怎么测试Controller、Service。app
Controller测试
本文就简单一点,写一个Hello接口。负载均衡
Controller单元测试
HTTP请求测试:学习
既然是测试Controller接口,确定就是发送HTTP请求了,以前的文章我也有提到,可使用Postman、Swagger进行测试,本文咱们采用编码的方式测试,新建HttpRequestTest类:测试
HTTP测试类编码
注意三个红框,这是告诉Spring Boot启动的时候采用一个随机的端口,有助于在测试环境中避免冲突(官网解释)。3d
绿框的restTemplate,看过以前个人《Spring Cloud网关与负载均衡Zuul与Ribbon》就知道,与RestTemplate差很少,这就是个HTTP客户端。rest
运行测试经过。注意看日志,会找到一行日志:日志
Tomcat started on port(s):XXXXX
这说明整个Tomcat已经启动成功了。
MockMVC测试:
注意上面的测试,经过日志咱们知道,其实就是启动了Tomcat,而后经过TestRestTemplate构建了HTTP请求。可是在咱们实际开发中,有一个现实的问题,咱们一个工程会有不少的Controller、Service、Mapper,可是咱们本次测试可能就测一个接口。为了一个接口,要启动整个Tomcat,太浪费了。因此咱们能够采用MockMVC,在不启动的服务的状况下,测试接口:
Mock测试
实际开发中,确定会有不少Controller,红框内咱们指定本次测试只实例化HellController这一个。
另外在开发的时候,Eclipse无法经过快捷键进行import static,因此咱们要手工导入如下:
导入
运行本测试,注意看日志,就不会出现Tomcat started on port(s):XXXXX的记录了。
Service测试
在实际开发中,Service的逻辑处理比较多,应该是最早被测试的,本示例增长一个Service和Mapper,以下:
Mapper
在我以前那个完整的工程中,这个注解应该是@Mapper,本例我没引入数据库,只是模拟一下,因此用了@Repository。
Service
在@Service下应该还有事务注解@Transactional,本例只是模拟,因此也没有加。
测试类以下:
测试类
注意红框,在实际开发中,咱们本身写的Controller、Service极可能去调用别的同事或别的项目组写的Service、Mapper,对方可能只写了一个接口,没有实现(好比本例中我写的Mapper),这样是无法进行测试的。
Mock的做用就是建立一个虚拟的对象替代那些不易构造或不易获取的对象。
本例中我都没有引入数据库的相关依赖,原本应该是链接数据库的Mapper,如今就是一个单纯的接口,若是不对Mapper进行处理,这个测试就无法进行下去。
因而在第一个红框内Mock了一个HelloMapper,第二个红框对这个Mock对象的方法进行了处理,等于Mapper接收参数“leo”,返回结果“Hello leo”,给Service使用。
运行测试经过。
Controller测试(含Service)
在“MockMVC测试”一节中,咱们只测了Controller里的一个方法,没有引入Service,这在实际工做中是不可能的,咱们要么引入本身写的Service,要么引入其余同事写的Service(接口形式),若是这时候引入的Service一样没有实现,这测试也无法作下去。结合“Service测试”的内容,咱们能够这么作:
Controller
Controller新增一个方法,调用了Service。
测试类
测试类增长如上代码,Mock一个假的Service,用when来处理Service,用MockMVC模拟HTTP请求,测试经过。