2009-02-13 13 views
5

Ich versuche derzeit, einen eingebetteten LDAP-Server für Komponententests zu verwenden.Spring eingebetteten LDAP-Server in Komponententests

In Spring Security können Sie schnell einen eingebetteten ldap-Server zum Testen mit dem Tag definieren, wobei einige Beispieldaten aus dem angegebenen Idif geladen werden.

Ich werde Spring Ldap verwenden, um LDAP-Vorgänge durchzuführen, und überlege, die üblichen CRUD-Funktionen meines Benutzerdienstobjekts zu testen.

Gibt es jedoch eine Möglichkeit, sicherzustellen, dass die Einträge im eingebetteten Server im gleichen konsistenten Zustand sind (so etwas wie alles löschen und die ldif-Einträge neu laden) für jeden Test, den ich ausführe?

Ich dachte an die folgenden: 1) zeigen, dass das Verfahren den Kontext dirties und zwingen, eine Erholung des eingebetteten LDAP-Server, die schmerzhaft klingt, als es den Server für jede Methode 2) neu zu starten, müsste erstellen die Testen Sie Einträge in einer Testorganisation, so dass ich sie losbinden kann und laden Sie die LDIF-Datei einfach wieder dorthin.

Ich bevorzuge 2, aber es scheint, als hätte das Spring LDAP keine guten Helfer zum Laden und Senden über den Inhalt einer LDIF-Datei.

Irgendwelche Vorschläge, wie Sie ldap Tests mit einem eingebetteten LDAP-Server des Frühlings durchführen, oder von den zwei möglichen Lösungen, die ich erwähne?

Dank

Antwort

3

Bietet keine LDAP Frühling Transaktionssteuerung um LDAP-Operationen? Wenn ja, warum nicht das Spring-Test-Framework mit seiner automatischen Rollback-Funktion verwenden?

Ich kenne auch einen JDBC-LDAP-Bridge-Treiber, der ein LDAP-Repository umschließt und es als relationale Datenbank darstellt. Ich habe iBatis verwendet, um sich damit zu verbinden (ich habe dies unter http://lokibear.blogspot.com geschrieben, siehe Artikel vom Juli). Ich habe noch nicht versucht, Transaktionskontrolle anzuwenden, aber die Website für den Fahrer erwähnt die Möglichkeit, Transaktionen zu ignorieren (was bedeutet, dass Sie auch nicht ignorieren können, nicht wahr?).

Wie gesagt, ich habe das noch nicht probiert; Wenn dies jedoch Transaktionen für LDAP bereitstellt, können Sie das Spring-Testframework erneut verwenden, um ein automatisches Rollback zu erhalten. Ich habe einen kurzen Cheatsheet um diesen Rahmen herum veröffentlicht - siehe die September-Beiträge in meinem Blog.

Tut mir leid, vielleicht fehlt mir hier Ihr Ziel; aber vielleicht sind diese Vorschläge nützlich. Viel Glück!

4

Ich bin hier möglicherweise nicht im Pfad, aber wenn Sie die LDAP-Integration nicht selbst testen, können Sie die LDAP-Verbindung mit einem Mock-Objekt ausschließen, das immer die erwarteten Werte zurückgibt, damit Ihre anderen Komponententests abgeschlossen werden können .

Wenn Sie die LDAP-Verbindung testen, führen Sie einen Integrationstest durch. In diesem Fall ist es wahrscheinlich am besten, eine Verbindung zu einer echten LDAP-Implementierung herzustellen.

2

Möglicherweise wissen Sie nicht oder nicht, dass die eingebettete LDAP-Funktionalität nicht von Spring LDAP selbst bereitgestellt wird, sondern Apache Directory Server. Unglücklicherweise hat der LDIF-Lader in Apache DS (wie von Spring sowieso verdrahtet) sehr schlechte Fehlerbehandlungs- und Berichtsfähigkeiten und wird sich daher wahrscheinlich nicht so verhalten, wie Sie es wirklich für einen Komponententest wollen. Wenn Sie wirklich jedes Mal mit einer sauberen Weste beginnen möchten, sollten Sie die Spring Security-LDAP-Einheitstests durchführen und Apache DS jedes Mal neu initialisieren, indem Sie eine saubere LDIF-Datei laden.

Alternativ können Sie LDIF komplett vermeiden und einen eigenen Unit-Test-Wrapper erstellen, der die Vor- und Nachbedingungen der Daten überprüft, bevor die Komponententests ausgeführt werden. Das wäre mehr Arbeit, aber letztendlich könnte es besser für Sie funktionieren.

1

funktioniert gut für mich:

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

fragte ich etwas ähnliches und bekam eine Antwort von Luke Taylor: Integration tests with spring-security and ldap