tag lib form spring spring-security spring-ldap

spring - form - tag lib jstl



Spring integrado servidor ldap en pruebas unitarias (4)

Actualmente estoy intentando usar un servidor ldap incrustado para pruebas unitarias.

En Spring Security, puede definir rápidamente un servidor ldap incorporado para probar con la etiqueta con algunos datos de muestra cargados desde el ldif especificado.

Utilizaré Spring Ldap para realizar operaciones ldap y estoy pensando en probar las funciones CRUD habituales de mi objeto de servicio de usuario.

¿Existe, sin embargo, una forma de asegurar que las entradas en el servidor incrustado estén en el mismo estado consistente (algo así como eliminar todo y volver a cargar las entradas ldif) para cada prueba que estoy ejecutando?

Pensé en lo siguiente: 1) Indicar que el método ensucia el contexto y forzar una recreación del servidor ldap incrustado, lo que suena doloroso ya que tendría que reiniciar el servidor para cada método 2) Crear las entradas de prueba en una organización de prueba , de modo que puedo desvincularlos y simplemente cargar en el archivo ldif nuevamente allí.

Prefiero 2, pero parece que Spring LDAP no tiene buenos ayudantes para cargar y enviar a través del contenido de un archivo ldif.

¿Alguna sugerencia sobre cómo realizar pruebas ldap con un servidor ldap embebido de la primavera, o sobre las dos posibles soluciones que menciono?

Gracias


Puede o no saber que la funcionalidad LDAP integrada no es proporcionada por Spring LDAP en sí misma, sino por Apache Directory Server . Desafortunadamente, el cargador LDIF en Apache DS (como está conectado por Spring, de todos modos) tiene muy poca capacidad de manejo de errores e informes, y como tal probablemente no se comporte como realmente desea para una prueba unitaria. Su mejor apuesta si realmente desea comenzar desde cero es tomar la iniciativa de las pruebas de la unidad LDAP de Spring Security y reiniciar siempre Apache DS, con una carga de archivos LDIF limpia.

Alternativamente, podría evitar LDIF por completo y construir su propia envoltura de prueba unitaria que verifica las condiciones previas y posteriores de los datos antes de que se ejecuten las pruebas de su unidad. Esto sería más trabajo, pero al final puede funcionar mejor para usted.


¿Spring LDAP no proporciona control transaccional en las operaciones LDAP? Si es así, ¿por qué no utilizar Spring test framework con su capacidad de retrotracción automática?

También sé de un controlador de puente JDBC-LDAP que envuelve un repositorio LDAP, presentándolo como una base de datos relacional. He usado iBatis para conectarme a esto (lo he escrito en http://lokibear.blogspot.com , vea artículos de julio). Todavía no he intentado aplicar el control transaccional, pero el sitio web del controlador menciona la posibilidad de ignorar las transacciones (lo que significa que tampoco puede ignorarlas ... ¿no?).

Como digo, aún no lo he intentado; pero, si esto proporciona transacciones en torno a LDAP, puede volver a utilizar el marco de prueba de Spring para obtener la retrotracción automática. He sacado una hoja de trucos rápida sobre ese marco: mira las publicaciones de septiembre en mi blog.

Lo siento, podría estar perdiendo tu objetivo aquí; pero tal vez estas sugerencias son útiles. ¡Buena suerte!


Puede que esté fuera de la ruta aquí, pero si no está probando la integración de LDAP, puede simular la conexión LDAP con un objeto falso que siempre devuelve los valores que espera para que sus otras pruebas de unidad puedan completarse.

Si está probando la conexión LDAP, entonces realmente está haciendo una prueba de integración. En cuyo caso, probablemente sea mejor conectarse a una implementación de LDAP real.


Funciona bien para mí:

@Inject private ApplicationContext applicationContext; @Before public void reloadLdapDirectory() throws NamingException, IOException{ ApacheDSContainer apacheDSContainer = (ApacheDSContainer) applicationContext.getBean(BeanIds.EMBEDDED_APACHE_DS); LdapTestUtils.clearSubContexts(contextSource, DistinguishedName.EMPTY_PATH); ClassPathResource classPathResource = new ClassPathResource("ldap.ldif"); File tempFile = File.createTempFile("spring_ldap_test", ".ldif"); try { InputStream inputStream = classPathResource.getInputStream(); IOUtils.copy(inputStream, new FileOutputStream(tempFile)); LdifFileLoader fileLoader = new LdifFileLoader(apacheDSContainer.getService().getAdminSession(), tempFile.getAbsolutePath()); fileLoader.execute(); } finally { try { tempFile.delete(); } catch (Exception e) { // Ignore this } } }

Le pregunté algo similar y obtuve una respuesta de Luke Taylor: Pruebas de integración con spring-security y ldap