2009-02-13 10 views
5

Actualmente estoy intentando utilizar un servidor ldap incorporado para pruebas unitarias.Servidor ldap integrado en la primavera en las 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 alguna manera 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) indican que el método ensucia el contexto, y forzar una recreación del servidor LDAP incorporado, que suena muy doloroso que tendría que reiniciar el servidor para cada método 2) Crear el entradas de prueba en una organización de prueba, de modo que pueda desvincularlas y simplemente cargar en el archivo ldif 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 de primavera ldap integrado, o sobre las dos posibles soluciones que menciono?

Gracias

Respuesta

3

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

También conozco 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 escribí al http://lokibear.blogspot.com, consulte los 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 también puede no ignorarlas ... ¿verdad?).

Como digo, todavía 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, me puede estar faltando su objetivo aquí; pero tal vez estas sugerencias son útiles. ¡Buena suerte!

4

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

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.

2

Puede que sepa o no que la funcionalidad LDAP incorporada no la proporciona Spring LDAP, sino 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 opción 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.

Como alternativa, 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 ejecutar las pruebas de su unidad. Esto sería más trabajo, pero al final puede funcionar mejor para usted.

1

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 
     } 
    } 
} 

me preguntó algo similar y obtuvo una respuesta de Luke Taylor: Integration tests with spring-security and ldap

Cuestiones relacionadas