SpringBootTest 及注解详解(含Mockito )
springboot框架的作用⼀、版本差异Spring Boot 2.2.0 版本开始引⼊ JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter-test 包含了 JUnit 4的依赖,Spring Boot 2.2.0 版本之后替换成了 Junit Jupiter。
导⼊的依赖如下:
可以看到,SpringBootTest默认集成了以下功能:JUnit 5: Java单元测试框架
Spring Test & Spring Boot Test: Spring Boot的测试⼯具和⽀持
AssertJ: 流式断⾔Hamcrest: Hamcrest断⾔
Mockito: Java Mock框架
JSONassert: JSON断⾔
JsonPath: XPath for JSON
⼆、SpringBootTest 和Junit5的使⽤
整体上,Spring Boot Test⽀持的测试种类,⼤致可以分为如下三类: <dependency > <groupId >org.springframework.boot </groupId > <artifactId >spring-boot-starter-test </artifactId > <scope >test </scope > </dependency >
1
2
3
4
5
1. 单元测试:⼀般⾯向⽅法,编写⼀般业务代码时,测试成本较⼤。涉及到的注解有@Test。
2. 切⽚测试:⼀般⾯向难于测试的边界功能,介于单元测试和功能测试之间。涉及到的注解有 @WebMvcTest等。主要就是对于Controller 的测
试,分离了Service 层,这⾥就涉及到Moc 控制层所依赖的组件了
3. 功能测试:⼀般⾯向某个完整的业务功能,同时也可以使⽤切⾯测试中的mock 能⼒,推荐使⽤。涉及到的注解有@SpringBootTest等。
1. 单元测试集成测试,不启动server ,以创建项⽬后⾃动⽣成的默认测试类为例:
默认⽆参数的@SpringBootTest 注解会加载⼀个Web Application Context 并提供Mock Web Environment ,但是不会启动内置的server 。这点从⽇志中没有打印Tomcat started on port(s)可以佐证。
2. 集成测试,启动server
新建⼀个测试类如下:
也可以通过指定@SpringBootTest的Web Environment为DEFINED_PORT 来指定server侦听应⽤程序配置的端⼝,默认为8080。不过这种指定端⼝的⽅式很少使⽤,因为如果本地同时启动应⽤时,会导致端⼝冲突。
3. 更多关系JUnit5集成SpringBootTest的例⼦,,我这⾥不在啰嗦
三、Spring Boot Test 中的主要注解
1. 在说之前,先看⼀下SpringBootTest的注解,Mockito 是⼀个独⽴的框架,被springboot 集成了⽽已。
从功能上讲,Spring Boot Test中的注解主要分如下⼏类@SpringBootTest class TestDemoApplicationTests { @Test void contextLoads () { }}
1
2
3
4
5
6//指定@SpringBootTest 的Web Environment 为RANDOM_PORT //此时,将会加载Applicaiton Context ,并启动server ,server 侦听在随机端⼝上。在测试类中通过@LocalServerPort 获取该端⼝值。@SpringBootTest(webEnvironment = SpringBootTest .WebEnvironment .RANDOM_PORT )public class DemoTest { @LocalServerPort private Integer port ; @Test @DisplayName("should access application") void shouldAccessApplication () { assertThat (port ).isGreaterThan (1024); }}
1
2
3
4
5
6
7
8
9
10
11
12
配置类型的注解:
使⽤@SpringBootApplication启动测试或者⽣产代码,被@TestComponent描述的Bean会⾃动被排除掉。如果不是则需要向@SpringBootApplication 添加TypeExcludeFilter。
mock类型的注解
@MockBean和@SpyBean这两个注解,在mockito框架中本来已经存在,且功能基本相同。Spring Boot Test⼜定义⼀份重复的注解,⽬的在于使MockBean和SpyBean被ApplicationContext管理,从⽽⽅便使⽤。
MockBean和SpyBean功能⾮常相似,都能模拟⽅法的各种⾏为。不同之处在于MockBean是全新的对象,跟正式对象没有关系;⽽SpyBean与正式对象紧密联系,可以模拟正式对象的部分⽅法,没有被模拟的⽅法仍然可以运⾏正式代码。
⾃动配置类型的注解(@AutoConfigure*)
这些注解可以搭配@\*Test使⽤,⽤于开启在@\*Test中未⾃动配置的功能。例如@SpringBootTest和@AutoConfigureMockMvc组合后,就可以注⼊st.web.servlet.MockMvc。
“⾃动配置类型”有两种使⽤⽅式:
1. 在功能测试(即使⽤@SpringBootTest)时显⽰添加。
2. ⼀般在切⽚测试中被隐式使⽤,例如@WebMvcTest注解时,隐式添加了@AutoConfigureCache、@AutoConfigureWebMvc、
@AutoConfigureMockMvc。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论