SpringBoot单元测试(Mock)
Spring Boot单元测试(Mock)
Java个⼈学习⼼得 2017-08-12 16:07
Mock
单元测试的重要性就不多说了,我这边的⼯程⼀般都是Spring Boot+Mybatis(详情可参看《》),现在写⼀下Spring Boot下怎么测试Controller、Service。
Controller测试
本⽂就简单⼀点,写⼀个Hello接⼝。
Controller
HTTP请求测试:
既然是测试Controller接⼝,肯定就是发送HTTP请求了,之前的⽂章我也有提到,可以使⽤Postman、Swagger进⾏测试,本⽂我们采⽤编码的⽅式测试,新建HttpRequestTest类:
HTTP测试类
注意三个红框,这是告诉Spring Boot启动的时候采⽤⼀个随机的端⼝,有助于在测试环境中避免冲突(官⽹解释)。
绿框的restTemplate,看过之前我的《》就知道,与RestTemplate差不多,这就是个HTTP客户端。
运⾏测试通过。注意看⽇志,会到⼀⾏⽇志:
Tomcat started on port(s):XXXXX
这说明整个Tomcat已经启动成功了。
MockMVC测试:
注意上⾯的测试,通过⽇志我们知道,其实就是启动了Tomcat,然后通过TestRestTemplate构建了HTT
P请求。但是在我们实际开发中,有⼀个现实的问题,我们⼀个⼯程会有很多的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测试”的内容,我们可以这么做:
spring boot面试题笔试题Controller
Controller新增⼀个⽅法,调⽤了Service。
测试类
测试类增加如上代码,Mock⼀个假的Service,⽤when来处理Service,⽤MockMVC模拟HTTP请求,测试通过。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论