mvc ejemplo dependencias configurar conceptos component arquitectura anotacion java unit-testing spring-mvc annotations bean-validation

java - ejemplo - Buenos patrones para pruebas unitarias de beans que tienen validación basada en anotaciones en Spring MVC



spring mvc ejemplo (4)

Cuando se utiliza la validación basada en anotaciones para un bean de formulario, ¿cuál es la mejor práctica para probar unidades de los beans con el fin de garantizar que se especifiquen anotaciones de validaciones correctas para cada campo?

Por ejemplo, si tiene:

public class MyForm { @NotNull private String name; }

¿Cuál es la mejor manera de verificar que se le aplique @NotNull ?

Una forma obvia es crear un validador, arrojar un nulo y esperar que falle. Pero en mi opinión, esta no es la mejor manera, ya que @NotNull el comportamiento y la implementación de @NotNull usando eso en lugar de confiar en el marco.

Idealmente, me gustaría utilizar la reflexión o una utilidad que me da la posibilidad de afirmar que una @NotNull (y cualquier otra) se aplica a un campo determinado, en lugar de tener que enviar varias combinaciones de valores que no validen.

¿Hay una forma elegante de hacerlo, o estoy en el camino correcto en general?


Dos cosas que debes considerar:

No pruebe sus bibliotecas / frameworks de terceros.

Debe confiar en ellos, se supone que ya han sido probados por sus mantenedores y por el uso de la comunidad circundante. No los prueba, más bien los evalúa . Para asegurarse de que se ajusten a sus necesidades y mitiguen los riesgos.

¡El comportamiento de prueba es lo que importa, realmente!

En la gran mayoría de las aplicaciones, hay poco lugar para las pruebas reales de UNIT , ya que la lógica comercial es pequeña y está muy extendida en múltiples módulos de la aplicación. Por lo tanto, debe considerar las pruebas de integración con la misma prioridad que las pruebas unitarias. Y esto se captura más fácilmente mediante el uso de un enfoque conductual.

Por lo tanto, para responder a su pregunta, no intente que la Unidad pruebe un form bean. Es solo un objeto de transporte. Lo que debe probar es cómo reacciona el receptor con esa forma, y ​​verifique tanto el caso normal como los casos extremos.


Probamos las anotaciones en propiedades de frijol como parte de las pruebas de integración entre nuestra capa de presentación y el contenedor de primavera.

Lo que hacemos es crear falsos MockPortletContext, DispatcherPortlet y MockRequests (estas clases son parte de la biblioteca de Spring-Test), llenar las solicitudes para que se vean como si estuvieran enviadas en forma real y luego llamar al dispatcherPortlet. (tenemos un entorno de portlet pero no importa)

Luego puede verificar que su servidor se haya llamado apropiadamente o que la respuesta contenga un resultado vinculante con los errores de validación esperados, que es lo que necesita.


Puedes probarlo fácilmente.

Digamos que está utilizando Hibernate Validator. Más o menos, debería ser algo como esto

import javax.validation.ConstraintViolation; import junit.framework.Assert; import org.hibernate.validator.HibernateValidator; import org.junit.Before; import org.junit.Test; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; private LocalValidatorFactoryBean localValidatorFactory; @Before public void setup() { localValidatorFactory = new LocalValidatorFactoryBean(); localValidatorFactory.setProviderClass(HibernateValidator.class); localValidatorFactory.afterPropertiesSet(); } @Test public void testNullValidationError() { final MyForm myForm= new MyForm (); myForm.setName(null); Set<ConstraintViolation<MyForm >> constraintViolations = localValidatorFactory.validate(myForm); Assert.assertTrue("Your error message", constraintViolations.notNull == null); }