背景
Java的单元测试可以使用多个框架,其中比较流行的包括:
- JUnit:JUnit是Java单元测试最常用的框架,它提供了一套丰富的API,可以方便地编写测试用例和测试套件。JUnit 5是JUnit的最新版本,引入了许多新功能和改进。
- Mockito:Mockito是一个模拟框架,可以模拟对象的行为和状态,以便在单元测试中检查方法的调用和参数。它提供了一组强大的API,可以方便地创建模拟对象和验证方法调用。
- Spring Test:如果你正在使用Spring框架开发应用程序,那么可以使用Spring Test框架进行单元测试。Spring Test提供了一套完整的测试解决方案,可以方便地测试Spring应用程序的各种方面。
Spring Boot Test的主要特点包括:
- 快速创建测试环境:通过使用Spring Boot的自动化配置功能,可以快速创建测试环境,无需手动配置。
- 提供丰富的测试功能:Spring Boot Test提供了丰富的测试功能,包括注解支持、MockMvc、RestTemplate等,可以方便地进行单元测试和集成测试。
- 集成JUnit和Mockito:Spring Boot Test集成了JUnit和Mockito等测试框架和模拟框架,可以方便地编写测试用例和模拟对象。
- 简化测试配置:通过使用Spring Boot的自动化配置功能,可以简化测试配置,只需关注测试用例的编写。
Spring Boot Test 包含了这些库
- JUnit 5:包含兼容JUnit4,Java 应用程序单元测试的事实标准
- Spring Test 和 SpringBootTest:对Spring Boot应用程序的公共和集成测试支持
- AssertJ:流式断言库
- Hamcrest:匹配对象库
- Mockito:Java 模拟框架
- JSONassert:JSON 断言库
- JsonPath: JSON XPath
MockMvc概念
MockMvc是Spring Test模块的一部分,它允许我们对Spring MVC控制器进行单元测试,而无需启动完整的Spring应用上下文。
MockMvc可以模拟HTTP请求和响应,MockMvc就像是一个虚拟的Spring MVC,能够让我们快速测试控制器。
MockMVC的基本步骤
(1) mockMvc.perform执行一个请求。
(2) MockMvcRequestBuilders.get(“XXX”)构造一个请求。
(3) ResultActions.param添加请求传值
(4) ResultActions.accept()设置返回类型
(5) ResultActions.andExpect添加执行完成后的断言。
(6) ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如处使用print()输出整个响应结果信息。
(7) ResultActions.andReturn表示执行完成后返回相应的结果。
实例化
方法一:通过参数指定一组控制器,这样就不需要从上下文获取
了
mockMvC = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
方法二:指定WebApplicationContext 将会从该上下文获得相应的控制器并得到相应的MockMvc
mockMVC=MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
步骤
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
1、双击选中你要测试的类,点击 Navigate
2、注意点击 Test 的时候鼠标要放在对应的类上
3、勾选你想要的
这时候生成的代码是这样的
package com.zhangyu.controller;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class HelloWorldControllerTest {
@BeforeEach
void setUp() {
}
@AfterEach
void tearDown() {
}
@Test
void index() {
}
}
根据上面的 MockMVC的基本步骤 我们编写代码
package com.zhangyu.controller;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class HelloWorldControllerTest {
private MockMvc mvc;
@BeforeEach
void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
}
@Test
void index() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
稍微解释一下这个几个新的注解:
- @SpringBootTest:获取启动类,加载配置,寻找主配置启动类(被 @SpringBootApplication 注解的)
- @RunWith(SpringRunner.class):让JUnit运行Spring的测试环境,获得Spring环境的上下文的支持。