La inyección de dependencia debería hacer que el código sea menos dependiente del contenedor de lo que sería con el
desarrollo tradicional de Java EE. Los POJO que componen su aplicación deben poder probarse en JUnit o TestNG junto
con los objetos instanciados usando el operador new
, sin la participación de Spring ni de ningún otro
contenedor. Puede utilizar objetos simulados (en combinación con otras técnicas de prueba útiles) para probar su
código de forma aislada. Si sigue las pautas de arquitectura de Spring, la vista resultante limpia, en capas y en
componentes del código base facilitará las pruebas unitarias. Por ejemplo, puede probar objetos de la capa de
servicio utilizando una función stub u objeto simulado para DAO o interfaces de almacenamiento, sin tener que
acceder a datos persistentes mientras ejecuta pruebas unitarias.
Las verdaderas pruebas unitarias suelen ser extremadamente rápidas porque no es necesario crear una infraestructura de ejecución. Hacer hincapié en las verdaderas pruebas unitarias como parte de la metodología de desarrollo puede mejorar la productividad. Es posible que no necesite esta sección del capítulo de pruebas para escribir pruebas unitarias efectivas para sus aplicaciones basadas en IoC. Sin embargo, para ciertos escenarios de pruebas unitarias, Spring Framework proporciona objetos simulados y clases auxiliares de prueba, que se tratan en este capítulo.
Objeto de imitación
Spring tiene varios paquetes diseñados para usar objetos simulados:
-
miércoles
-
JNDI
-
API de servlets
-
Módulo Web Reactive en Spring
Medio ambiente
El paquete org.springframework.mock.env
contiene implementaciones simuladas de las abstracciones Environment
y PropertySource
(ver "Perfiles
de definición de frijol" y "Abstracción
PropertySource
"). MockEnvironment
y MockPropertySource
son útiles para
desarrollar pruebas sin contenedores para código que depende de propiedades específicas del entorno.
JNDI
El paquete org.springframework.mock.jndi
contiene una implementación parcial de la interfaz JNDI SPI que
se puede utilizar para crear un marco JNDI simple para conjuntos de pruebas o aplicaciones independientes. Si, por
ejemplo, las instancias DataSource
de JDBC están vinculadas a los mismos nombres JNDI en el código de
prueba que en el contenedor Java EE, entonces tanto el código de la aplicación como la configuración se pueden
reutilizar en los scripts de prueba sin modificaciones.
org.springframework.mock.jndi
ha quedado oficialmente obsoleta desde Spring Framework 5.2, a favor de Soluciones listas para usar de
desarrolladores externos como Simple-JNDI.
API de servlet
El paquete org.springframework.mock.web
contiene un conjunto completo de objetos simulados de API de
Servlet que son útiles para probar contextos web, controladores y filtros. Estos objetos simulados están diseñados
para usarse con el marco Spring Web MVC y generalmente son más fáciles de usar que los objetos simulados dinámicos
(por ejemplo, EasyMock) u objetos simulados de API de Servlet
alternativos (por ejemplo, MockObjects).
org.springframework.mock.web
se basan en Servlet API 4.0.
El marco de prueba Spring MVC se basa en objetos simulados de Servlet API, que proporciona un marco de prueba de integración para Spring MVC. Consulte "MockMvc".
Módulo Web Reactive en Spring
El paquete org.springframework.mock.http.server.reactive
contiene implementaciones simuladas de ServerHttpRequest
y ServerHttpResponse
para usar en aplicaciones WebFlux. El paquete org.springframework.mock.web.server
contiene un objeto simulado ServerWebExchange
que depende de estos objetos simulados de solicitud y
respuesta.
Tanto MockServerHttpRequest
como MockServerHttpResponse
provienen de las mismas clases base
abstractas que las implementaciones específicas del servidor y comparten una lógica común con ellas. Por ejemplo, un
objeto de solicitud simulada no es reemplazable una vez creado, pero puedes usar el método mutate()
de
ServerHttpRequest
para crear una instancia modificada.
Para que el objeto de respuesta simulada implemente correctamente el contrato de escritura y devuelva un
identificador de finalización de escritura (es decir, Mono<Void>
), su valor predeterminado es
Flux
. con cache().then()
, que almacena los datos en un buffer y los pone a disposición
para afirmaciones en las pruebas. Las aplicaciones pueden instalar una función de grabación especial (por ejemplo,
para comprobar si hay un hilo infinito).
WebTestClient se basa en un objeto de solicitud simulado y un objeto de respuesta y proporciona soporte para probar aplicaciones WebFlux sin Servidores HTTP. La parte del cliente también se puede utilizar para pruebas de un extremo a otro con un servidor en ejecución.
Clases de ayuda para pruebas unitarias
Spring contiene una serie de clases que pueden ayudar con las pruebas unitarias. Se dividen en dos categorías:
-
Utilidades de prueba de uso general
-
Utilidades para realizar pruebas en Spring MVC
Utilidades de prueba de uso general
El paquete org.springframework.test.util
contiene varias utilidades de propósito general para usar en
pruebas unitarias y de integración.
ReflectionTestUtils
es una colección de métodos de utilidad basados en la reflexión. Puede utilizar
estos métodos en scripts de prueba cuando necesite cambiar el valor de una constante, establecer un campo no público
,
llamar a un definidor no público
o llamar a un configuración no pública
code> o método de
devolución de llamada del ciclo de vida al probar el código de la aplicación en los siguientes casos:
-
Marcos ORM (como JPA e Hibernate) que permiten el acceso
privado
oprotected
a los campos, a diferencia de los establecedores de propiedadespúblicos
en el esencia del área temática. -
Soporte para anotaciones Spring (como
@Autowired
,@Inject
y@Resource
), que proporcionan inyección de dependencia paraprivado.
oprotegido
campos, definidores y métodos de configuración. -
Utilice anotaciones como
@PostConstruct
y@PreDestroy
para los métodos de devolución de llamada del ciclo de vida.
AopTestUtils
es una colección de métodos de utilidad relacionados con AOP.
Puede utilizar estos métodos para obtener una referencia a un objetivo subyacente oculto detrás de uno o más
servidores proxy Spring. Por ejemplo, si ha configurado un bean como un objeto simulado dinámico usando una
biblioteca como EasyMock o Mockito, y ese objeto simulado está envuelto en un proxy Spring, es posible que necesite
acceder directamente al objeto simulado subyacente para configurar los eventos esperados para él. y realizar la
verificación. Para obtener información sobre las principales utilidades de AOP en Spring, consulte los temas en AopUtils
y AopProxyUtils
.
Utilidades para realizar pruebas en Spring MVC
El paquete org.springframework.test.web
contiene ModelAndViewAssert
que puede usar en combinación con JUnit, TestNG o cualquier
otro marco de prueba para pruebas unitarias que trabajen con ModelAndView
objetos de Spring MVC.
Controller
de Spring MVC
como POJO, use ModelAndViewAssert
en combinación con MockHttpServletRequest
, MockHttpSession
,
etc. de entre los objetos simulados de la API de Servlet. Para realizar pruebas de integración exhaustivas de las
clases Controller
de Spring MVC y REST en combinación con la configuración
WebApplicationContext
para Spring MVC, utilice Spring MVC Test Framework.