Tests Unitaires avec LDAP

13 Jul 2014

Mocker les appels de méthodes dans des classes interrogeant un annuaire LDAP peut être rébarbatif. On peut penser à configurer le TU pour interroger une annuaire existant. Cependant le maintient des données du test devient plus difficile. ApacheDS founit un ensemble d'annotation permettant - de créer un annuaire LDAP pour la durée de vie du test - de l'alimenter avec des données

Le détail présenté ici fonctionne avec la version 2.0.0-M10. Il est possible que cela ne fonctionne pas avec d'autres versions (supérieures ou inférieures)

Dépendances maven

Les dépendances maven à utiliser sont les suivantes

<dependency>
    <groupId>org.apache.directory.server</groupId>
    <artifactId>apacheds-server-integ</artifactId>
    <version>2.0.0-M10</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.directory.server</groupId>
    <artifactId>apacheds-core-integ</artifactId>
    <version>2.0.0-M10</version>
    <scope>test</scope>
</dependency>

De plus il est nécessaire de déclarer un plugin dans la section <build>

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.7</version>
    <inherited>true</inherited>
    <extensions>true</extensions>
</plugin>

Création de l'instance

La classe de test doit être annotée avec les annotations suivantes :

@RunWith(FrameworkRunner.class)
@CreateDS(name = "pe", 
    partitions = { 
        @CreatePartition(name = "my-root", suffix = "o=my-root", 
            contextEntry = @ContextEntry(entryLdif = "dn: o=my-root\n"
                                                    + "objectclass: top\n"
                                                    + "objectclass: organization\n"
                                                    + "o: my-root\n\n"), 
                                        indexes = {
                                            @CreateIndex(attribute = "objectclass"), @CreateIndex(attribute = "o"),
                                            @CreateIndex(attribute = "ou") })
})
@CreateLdapServer(transports = @CreateTransport(protocol = "LDAP", address = "localhost", port = 11389))

L'annotation @CreateLdapServer créé une instance de l'annuaire écoutant sur le port 11389. Les autres annotations permettent de créer une partition pour stocker les données.

ApacheDS founit aussi une classe abstraite org.apache.directory.server.core.integ.AbstractLdapTestUnit permettant d'interroger directement l'instance créé pour par exemple contrôler son contenu.

Importation des données

Des fichiers LDIF peuvent être importés avant l'exécution des méthodes de tests en utilisant l'annotation @ApplyLdifFiles

@Test
@ApplyLdifFiles({ "schema.ldif", "donnees.ldif" })
public void testLdap() throws Exception {}

Malheureusement très peu de doc existe sur le net...

Un projet exemple se trouve ici.