SpringBoot中@Test的介绍和使用案例
作者:fking86
SpringBoot Test介绍
SpringBoot提供了方便的测试功能,可以很容易地进行单元测试和集成测试。主要包含以下几点:
- Spring Boot提供了@SpringBootTest注解,可以用来启动Spring Boot应用,进行集成测试。
- Spring Boot提供了@MockBean注解,可以用来 Mock Bean。
- Spring Boot提供了@SpyBean注解,可以用来 Spy Bean。
- Spring Boot提供了@SpringBootConfiguration注解,可以用来声明配置类。
- Spring Boot提供了AssertJ的支持,可以用来进行断言。
- Spring Boot提供了测试相关的工具类,如TestRestTemplate等。
- SpringBoot提供了@LocalServerPort可以非常方便的模拟客户端,对运行的服务进行端到端集成测试
- SpringBoot提供了自动配置MockMvc,方便在测试类中直接注入并使用MockMvc
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
常用注解
@SpringBootTest
这个注解用来进行集成测试,会启动整个Spring Boot应用,进行端到端测试。
用法:
@SpringBootTest public class MyTest { // 测试方法 }
可以通过webEnvironment参数来指定测试环境:
- MOCK:加载Web Application Context,不启动Servlet容器。
- RANDOM_PORT:加载Servlet容器,使用随机端口。
- DEFINED_PORT:加载Servlet容器,使用定义好的端口。
- NONE:加载Web Application Context,但是不启动Servlet容器。
@WebMvcTest
这个注解用来测试Web层,会自动注入Web层的Bean,不会启动整个Spring Boot应用。
用法:
@WebMvcTest(UserController.class) public class MyTest { @Autowired private MockMvc mvc; // 测试方法 }
@DataJpaTest
这个注解用来测试JPA相关的Bean,会自动配置Spring Data JPA相关的Bean。
用法:
code@DataJpaTest public class MyTest { @Autowired private TestEntityManager entityManager; @Autowired private UserRepository userRepository; // 测试方法 }
@MockBean
这个注解用来Mock一个Bean,注入测试类中,用来Isolation测试。
用法:
@SpringBootTest public class MyTest { @MockBean private UserService userService; // 测试方法 }
@SpyBean
这个注解用来Spy一个Bean,注入测试类中,不影响真正的Bean。
用法:
@SpringBootTest public class MyTest { @MockBean private UserService userService; // 测试方法 }
@SpringBootConfiguration
这个注解用来声明配置类,相当于@Configuration。
用法:
@SpringBootConfiguration public class MyConfig { // 配置代码 }
可以用在测试类中加载额外的配置类。
@LocalServerPort
这个是一个非常有用的注解,它可以为测试获取启动的嵌入式服务器实例的实际端口号。
主要作用和用法如下:
自动注入启动的服务器端口号
在测试类中,可以像下面这样使用@LocalServerPort注解:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class MyTest { @LocalServerPort private int port; // 测试方法可以使用port变量 }
这样就可以拿到随机分配的端口号。
结合@Value使用
@LocalServerPort也可以和@Value结合使用:
@Value("${local.server.port}") private int port;
测试端点
有了端口号,可以通过测试端点进行验证:
@Autowired private TestRestTemplate restTemplate; @Test public void test() { String body = this.restTemplate.getForObject("http://localhost:" + port + "/hello", String.class); assertEquals("Hello World", body); }
模拟客户端
使用@LocalServerPort可以非常方便的模拟客户端,对运行的服务进行端到端集成测试。
@AutoConfigureMockMvc
这个是Spring Boot提供的一个便捷的注解,可以用来自动配置MockMvc,方便在测试类中直接注入并使用MockMvc。
主要作用如下:
自动注入MockMvc
在测试类中,可以直接注入MockMvc:
@Autowired private MockMvc mvc;
不需要自己配置MockMvc。
结合@WebMvcTest使用
@AutoConfigureMockMvc经常和@WebMvcTest一起使用,对控制器进行单元测试:
@WebMvcTest @AutoConfigureMockMvc public class TestController { @Autowired private MockMvc mvc; @MockBean private UserService userService; @Test public void test() throws Exception { // 使用MockMvc进行请求测试 } }
模拟HTTP请求
有了MockMvc,可以轻松模拟各种HTTP请求来测试控制器:
// GET mvc.perform(get("/users")) .andExpect(status().isOk()); // POST mvc.perform(post("/users")) .andExpect(status().isCreated()); // 模拟参数 mvc.perform(get("/users").param("name", "test")) .andExpect(content().string(containsString("test")));
验证响应
可以通过MockMvc对响应结果进行验证:
mvc.perform(get("/users/1")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.name").value("Test User"));
总之,@AutoConfigureMockMvc可以灵活地模拟HTTP请求,并验证响应,使得测试Web层变得非常方便。它通常与@WebMvcTest注解配合使用,为 Spring Boot的测试提供了很大的便利。
到此这篇关于SpringBoot中@Test的介绍和使用的文章就介绍到这了,更多相关SpringBoot @Test使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!