本文内容来自Spring Boot相关书籍学习总结
Spring Boot集成单元测试
单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。
1、导入pom依赖spring-boot-starter-test
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
该依赖包提供了大量应用测试需要的工具和注解。
常用单元测试注解:
@RunWith(SpringRunner.class):结合Junit的测试运行器,声明测试运行在Spring环境,作用类上@SpringBootTest:配置SpringBoot测试功能,作用类@Test:测试方法,作用方法@Ignore:忽略测试方法,作用方法@BeforeClass:针对所有测试,只执行一次,且必须为static void@Before:初始化方法,执行当前测试类的每个测试方法前执行@After:释放资源,执行当前测试类的每个测试方法后执行@AfterClass:针对所有测试,只执行一次,且必须为static void
2、Service层单元测试
一般使用Spring Boot进行单元测试主要是针对Service和API(Controller)进行。
使用IDEA可以一键自动创建单元测试类。首先,选择需要测试的Service类或方法,然后在对应的Service类中右击,选择Go To→Test→Create New Test,打开如图所示界面
勾选待测试方法,单击OK按钮生成测试类。
在测试方法中实现对应的测试代码。
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void findUser() {
Assert.notNull(userService.findUser(5L),"用户不存在");
}
}
2、Controller层单元测试
使用mockmvc,它是基于RESTful风格的SpringMVC单元测试,可以测试完整的SpringMVC流程。
1、MockMvc
- 服务器端SpringMVC测试的主入口点。
- 通过MockMVCBuilders建造者的静态方法创建MockMVCBuilder,MockMvc由MockMVCBuilder构造。
- 核心方法:perform(RequestBuilder rb),执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions。
2、MockMVCBuilder
- MockMVCBuilder是使用构造者模式来构造MockMvc的构造器。
- 主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
- 可以直接使用静态工厂MockMvcBuilders创建即可。
3、MockMvcBuilders
-
负责创建MockMVCBuilder对象。
-
有两种创建方式
- standaloneSetup(Object... controllers): 通过参数指定一组控制器,这样就不需要从上下文获取了。
- webAppContextSetup(WebApplicationContext wac):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc。
4、MockMvcRequestBuilders
- 用来构建Request请求的。
- 其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。
5、ResultActions
-
andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
-
andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台。
-
andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理。
-
MockMvcResultMatchers
- 用来匹配执行完请求后的**结果验证。
- 结果匹配失败将抛出相应的异常。
- 包含了很多验证API方法。
-
MockMvcResultHandlers
- 结果处理器,表示要对结果做点什么事情。
- 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息
6、MvcResult
单元测试执行结果,可以针对执行结果进行自定义验证逻辑。
通用模板:
@SpringBootTest
@RunWith(SpringRunner.class)
public class MockMVCTest {
private MockMvc mockMvc;
@Autowired
private UserController userController;
@Before
public void setUp(){
mockMvc = MockMvcBuilders.standaloneSetup(userController).build();//初始化mockmvc
}
@Test
public void testView() throws Exception{
String requestBody = "{\"id\":\"1\"}";
MvcResult result = mockMvc.perform(MockMvcRequestBuilders
.post("/user/1")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(requestBody))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
对于返回的结果,可以使用断言进行判断。