测试是企业软件开发不可缺少的一部分。
翻开任何一个优秀的开源框架源码,会发现在测试的包里面有不亚于源码的代码量。如何快速的编写出针对性的测试代码,也是一门绝活。
这里不展开讲解Mockito等测试框架,只针对Spring Boot应用,给出Spring Boot开发中常用的测试方法,帮助你进行快速测试开发。
导入依赖
Maven
Gradle
注解
@SpringBootTest : 从当前的标记该注解的测试类开始找,直至找到@SpringBootApplication或者@SpringBootConfiguration。就从标记了上述两个注解的类开始扫描bean。
也就是说,你可以在Test类里面自定义项目启动类。
比如:
下面是你的项目启动入口
如果你的测试类如下
那么DemoSpringApplication就会是应用启动类,能够测试通过。
但是如果,你在WhereToScanTest该包下创建一个@SpringConfiguration注解的类,只是简单加上一个@SpringBootConfiguration注解,测试就会失败。
这是因为只扫描标记了@SpringBootConfiguration的MyConfig类下的包,并不会创建ClassA的bean。
使用参数
测试web应用程序
如果只是用@SpringBootTest注解,不会开启web环境,如果想要测试web代码,可以加上@AutoConfigureMockMvc注解。
实例代码:
注意:这会扫描所有的spring注解并实例化完整的ApplicationContext,也就是启动整个Spring应用,如果你想只测试mvc部分,可以考虑使用@WebMvcTest。该测试是启动一个mock的web环境。
如果想测试真实的sever,使用如下注解,推荐使用一个随机端口进行测试。
其中@LocalServerPort会将程序启动的端口注入到port字段里去。
Mock
适合哪种情况些服务在开发环境无法调用,那么就需要mock,mock意思是模拟,也就是说模拟某些bean来进行你想要的测试。
例如你定义了一个远程访问的service,但是开发环境无法调通,则可以模拟。
@MockBean的用法
@MockBean 向测试程序注入了一个RemoteService的Bean,但是具体怎么定义方法怎么执行是需要你来说明的。其中given()方法是Mockito测试框架的方法,意思是如果调用remoteService的sayHello方法,就返回“Hello mock bean”。
分模块测试(WebMVC)
如果使用SpringBootTest,就是扫描整个应用内的bean。在一个项目中可能有很多的Spring Boot Starter,例如只想测试mvc,而不想测试jdbc,那么就需要使用@…Test。
使用@WebMvcTest注解,只会自动配置webmvc相关的功能,只会扫描如下的Bean。
@Controller
@ControllerAdvice
@JsonComponent
Converter
Filter
WebMvcConfigure
…
指定只测试某个Controller:
@WebMvcTest(xxxController.class) 只向web中添加该controller,例如该例子只会有UserController,如果还有其他Controller定义其他的@RequestMapping,在测试程序中访问是会404,因为这里我们只定义加载了UserController。
分模块测试(Data JPA )
和上面的mvc模块一样,@DataJpaTest也是只开启JPA相关自动配置,只扫描@Entinty和JpaRepository。使用@DataJpaTest在会回退事务,所以不用担心会向数据库插入无效的数据,默认该注解会使用内嵌的内存数据库,如果想要使用你本地的例如localshot:3306数据库,需要使用如下注解。
可以注入TestEntityManager进行一些操作,也可以注入测试自定义的Repository。
Spring其他测试方法
如果你什么注解也不想用,既不想测试Data JPA 也不想测试 mvc,只是想注册几个bean,然后启动做些测试,那么也可以用下面两个类。
可以用ApplicationContextRunner,该类是一个标准的,无web的环境。
可以直接用ApplicationContext,该类是Spring为应用程序提供配置的核心接口,例如AnnotationConfigApplicationContext。
用法如下:
总结
能够写出有针对性的测试代码,其实也不是一件容易的事,如果你对代码质量有较高要求,代码层面测试是不可缺少的一部分。希望这篇文章能帮到你一二。这里只是大概列出了一些测试案例,养成代码测试的习惯,更多测试的技巧可以在不断的测试中自己挖掘。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92160 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!