Introducción a la prueba de arranque de primavera
SpringBoot proporciona funciones de prueba convenientes, que pueden realizar fácilmente pruebas unitarias y pruebas de integración. Incluye principalmente los siguientes puntos:
- Spring Boot proporciona la anotación @SpringBootTest, que se puede utilizar para iniciar aplicaciones Spring Boot para pruebas de integración.
- Spring Boot proporciona la anotación @MockBean, que se puede utilizar para Mock Bean.
- Spring Boot proporciona la anotación @SpyBean, que puede usarse para espiar beans.
- Spring Boot proporciona la anotación @SpringBootConfiguration, que se puede utilizar para declarar clases de configuración.
- Spring Boot proporciona soporte para AssertJ, que se puede utilizar para realizar afirmaciones.
- Spring Boot proporciona clases de herramientas relacionadas con pruebas, como TestRestTemplate, etc.
- SpringBoot proporciona @LocalServerPort, que puede simular fácilmente el cliente y realizar pruebas de integración de un extremo a otro en el servicio en ejecución.
- SpringBoot proporciona configuración automática de MockMvc, que es conveniente para la inyección directa y el uso de MockMvc en clases de prueba.
confiar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Notas comunes
@SpringBootTest
Esta anotación se utiliza para pruebas de integración e iniciará toda la aplicación Spring Boot para pruebas de un extremo a otro.
uso:
@SpringBootTest
public class MyTest {
// 测试方法
}
El entorno de prueba se puede especificar mediante el parámetro webEnvironment:
-
MOCK: carga el contexto de la aplicación web sin iniciar el contenedor de servlet.
-
RANDOM_PORT: carga el contenedor de servlet y utiliza un puerto aleatorio.
-
DEFINED_PORT: carga el contenedor de servlet y utiliza el puerto definido.
-
NINGUNO: carga el contexto de la aplicación web, pero no inicia el contenedor de servlet.
@WebMvcTest
Esta anotación se utiliza para probar la capa web e inyectará automáticamente el Bean de la capa web, sin iniciar toda la aplicación Spring Boot.
uso:
@WebMvcTest(UserController.class)
public class MyTest {
@Autowired
private MockMvc mvc;
// 测试方法
}
@DataJpaTest
Esta anotación se utiliza para probar beans relacionados con JPA y configurará automáticamente los beans relacionados con Spring Data JPA.
uso:
javaCopy code@DataJpaTest
public class MyTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
// 测试方法
}
@MockBean
Esta anotación se utiliza para simular un Bean e inyectarlo en la clase de prueba para realizar pruebas de aislamiento.
uso:
javaCopy code@SpringBootTest
public class MyTest {
@MockBean
private UserService userService;
// 测试方法
}
@SpyBean
Esta anotación se utiliza para espiar un bean e inyectarlo en la clase de prueba sin afectar al bean real.
uso:
@SpringBootTest
public class MyTest {
@SpyBean
private UserService userService;
// 测试方法
}
@SpringBootConfiguración
Esta anotación se utiliza para declarar clases de configuración, equivalente a @Configuration.
uso:
@SpringBootConfiguration
public class MyConfig {
// 配置代码
}
Se puede utilizar en clases de prueba para cargar clases de configuración adicionales.
@PuertoServidorLocal
Esta es una anotación muy útil para obtener el número de puerto real de la instancia del servidor integrado iniciada para realizar pruebas.
La función principal y el uso son los siguientes:
El número de puerto del servidor para el inicio de la inyección automática.
En la clase de prueba, la anotación @LocalServerPort se puede utilizar así:
javaCopy code@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyTest {
@LocalServerPort
private int port;
// 测试方法可以使用port变量
}
De esta forma, podrá obtener el número de puerto asignado aleatoriamente.
Úselo junto con @Value
@LocalServerPort también se puede combinar con @Value:
javaCopy code@Value("${local.server.port}")
private int port;
punto final de prueba
Con el número de puerto en mano, se puede verificar probando el punto final:
javaCopy code@Autowired
private TestRestTemplate restTemplate;
@Test
public void test() {
String body = this.restTemplate.getForObject("http://localhost:" + port + "/hello", String.class);
assertEquals("Hello World", body);
}
cliente simulado
El uso de @LocalServerPort puede simular de manera muy conveniente al cliente y realizar pruebas de integración de un extremo a otro en servicios en ejecución.
@AutoConfigureMockMvc
Esta es una anotación conveniente proporcionada por Spring Boot, que se puede usar para configurar automáticamente MockMvc para facilitar la inyección directa y el uso de MockMvc en clases de prueba.
Las funciones principales son las siguientes:
Inyectar automáticamente MockMvc
En la clase de prueba, puedes inyectar MockMvc directamente:
@Autowired
private MockMvc mvc;
No es necesario configurar MockMvc usted mismo.
Usar con @WebMvcTest
@AutoConfigureMockMvc se usa a menudo con @WebMvcTest para realizar pruebas unitarias de controladores:
@WebMvcTest
@AutoConfigureMockMvc
public class TestController {
@Autowired
private MockMvc mvc;
@MockBean
private UserService userService;
@Test
public void test() throws Exception {
// 使用MockMvc进行请求测试
}
}
Simular solicitudes HTTP
Con MockMvc, es fácil simular varias solicitudes HTTP para probar controladores:
// 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")));
respuesta de validación
MockMvc puede verificar el resultado de la respuesta:
mvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.name").value("Test User"));
En resumen, @AutoConfigureMockMvc puede simular de manera flexible solicitudes HTTP y verificar respuestas, lo que hace que sea muy conveniente probar la capa web. Por lo general, se usa junto con la anotación @WebMvcTest, lo que proporciona una gran comodidad para las pruebas de Spring Boot.
escribe al final
Si está interesado en artículos relacionados, puede prestar atención a la cuenta oficial "Architecture Palace" y continuará actualizando AIGC, preguntas de entrevistas básicas de Java, netty, spring boot, spring cloud y otras series de artículos, y una serie de ¡Los productos secos se entregarán en cualquier momento!