7 - Embedding ApacheDS in Java¶
Using ApacheDS for unit tests¶
The idea is to use ADS as an embedded server for Ldap junit tests. We will build an environment in which it will be convenient to test Ldap applications.
We also want to avoid launching the server for every test, as it's an expensive operation. We have built ApacheDS so that you can start a server, inject some data, launch a test, then revert the data and go on to another test. At the end of the tests, the server is stopped.
Prerequicites¶
We will assume you have Maven project and using JUNIT for testing
First steps¶
Maven¶
You need to add following dependency to your pom.xml
:
<dependency> <groupId>org.apache.directory.server</groupId> <artifactId>apacheds-test-framework</artifactId> <version>2.0.0.AM25</version> <scope>test</scope> </dependency>
Please NOTE: you need to exclude org.apache.directory.api:api-ldap-schema-data
artifact from above dependency in case your project uses org.apache.directory.api:api-all
Java¶
Maven set-up was easy enough, let's create our first unit test:
Resources¶
Lets describe your LDAP structure in external LDIF file
Create file src/test/resources/users.ldif
with following text:
version: 1 dn: dc=myorg,dc=com objectClass: domain objectClass: top dc: myorg dn: ou=Users,dc=myorg,dc=com objectClass: organizationalUnit objectClass: top ou: Users dn: ou=Groups,dc=myorg,dc=com objectClass: organizationalUnit objectClass: top ou: Groups dn: cn=Test1 Ldap,ou=Users,dc=myorg,dc=com objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: top cn: Test1 Ldap sn: Ldap uid: ldaptest1 userPassword: 12345
Basic test¶
import org.apache.directory.server.core.integ.AbstractLdapTestUnit; import org.apache.directory.server.core.integ.FrameworkRunner; import org.apache.directory.server.core.annotations.CreateDS; import org.apache.directory.server.core.annotations.CreatePartition; import org.apache.directory.server.annotations.CreateLdapServer; import org.apache.directory.server.annotations.CreateTransport; import org.apache.directory.server.core.annotations.ApplyLdifFiles; import org.junit.runner.RunWith; import org.junit.Test; @RunWith(FrameworkRunner.class) @CreateDS(name = "myDS", partitions = { @CreatePartition(name = "test", suffix = "dc=myorg,dc=com") }) @CreateLdapServer(transports = { @CreateTransport(protocol = "LDAP", address = "localhost")}) @ApplyLdifFiles({"users.ldif"}) public class TestLdap extends AbstractLdapTestUnit { @Test public void test() { //do whatever you need with `ldapServer` } }
As a result you can access running ApacheDS server at ldap://localhost:<random port>
inside your test, or access server internals via static ldapServer
.
Advanced usage¶
Often you need to add LDAP unit tests to already created tests, in this case you might
not be allowed to extend AbstractLdapTestUnit
and/or to @RunWith(FrameworkRunner.class)
In this case you can use @ClassRule
.
Here is the example:
import org.apache.directory.server.core.annotations.CreateDS; import org.apache.directory.server.core.annotations.CreatePartition; import org.apache.directory.server.annotations.CreateLdapServer; import org.apache.directory.server.annotations.CreateTransport; import org.apache.directory.server.core.annotations.ApplyLdifFiles; import org.apache.directory.server.core.integ.CreateLdapServerRule; import org.junit.ClassRule; import org.junit.Test; @CreateDS(name = "myDS", partitions = { @CreatePartition(name = "test", suffix = "dc=myorg,dc=com") }) @CreateLdapServer(transports = { @CreateTransport(protocol = "LDAP", address = "localhost")}) @ApplyLdifFiles({"users.ldif"}) public class TestLdap { @ClassRule public static CreateLdapServerRule serverRule = new CreateLdapServerRule(); @Test public void test() { //do whatever you need with `serverRule.getLdapServer()` } }
As you can see the code if very much the same, the only difference: you are working with
serverRule.getLdapServer()
and not with ldapServer