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.

La compatibilidad con objetos simulados JNDI en el paquete 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).

A partir de Spring Framework 5.0, los objetos simulados en 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 o protected a los campos, a diferencia de los establecedores de propiedades públicos en el esencia del área temática.

  • Soporte para anotaciones Spring (como @Autowired, @Inject y @Resource), que proporcionan inyección de dependencia para privado. o protegido 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.

Para probar unitariamente las clases 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.