2009-02-13 15 views
5

Obecnie próbuję użyć osadzonego serwera LDAP do testów jednostkowych.Wbudowany serwer LDAP w testach jednostkowych

W Spring Security można szybko zdefiniować osadzony serwer LDAP do testowania za pomocą tagu z przykładowymi danymi załadowanymi z określonego ldif.

Będę używał Spring Ldap do wykonywania operacji Ldap i myślę o testowaniu zwykłych funkcji CRUD mojego obiektu usługi User.

Czy istnieje jednak sposób na zapewnienie, aby wpisy na serwerze osadzonym były w tym samym, spójnym stanie (podobnie jak usuwanie wszystkich i ponowne ładowanie wpisów ldif) dla każdego uruchomionego testu?

myślałem o następujące elementy: 1) wskazują, że metoda brudzi kontekst i wymusić odtworzenie wbudowanego serwera LDAP, który brzmi bolesne gdyż trzeba ponownie uruchomić serwer dla każdej metody 2) Stworzy testuj wpisy w organizacji testowej, dzięki czemu mogę je odpiąć i po prostu wczytać ponownie do pliku ldif.

Preferuję 2, ale wygląda na to, że Spring LDAP nie ma dobrych pomocników do załadowania i przesłania zawartości pliku ldif.

Jakieś sugestie dotyczące wykonywania testów LDA z wbudowanym serwerem Ldap na wiosnę lub z dwóch możliwych rozwiązań, o których wspomnę?

Dzięki

Odpowiedz

3

Nie Spring LDAP zapewniają kontrolę transakcyjnej wokół operacji LDAP? Jeśli tak, to dlaczego nie skorzystać ze Spring Test Framework z funkcją automatycznego przywracania?

Znam również sterownik mostu JDBC-LDAP, który opakowuje repozytorium LDAP, przedstawiając go jako relacyjną bazę danych. Użyłem iBatis do połączenia się z tym (napisałem to na http://lokibear.blogspot.com, zobacz artykuły z lipca). Jeszcze nie próbowałem stosować kontroli transakcji, ale strona internetowa dla sterownika wspomina o możliwości zignorowania transakcji (co oznacza, że ​​możesz także nie zignorować ich ... prawda?).

Tak jak mówię, jeszcze tego nie próbowałem; ale jeśli zapewnia to transakcje wokół LDAP, możesz ponownie użyć Spring Test Framework, aby przywrócić automatyczne przywracanie. Wydałem szybki cheatsheet wokół tego frameworka - zobacz wrześniowe posty na moim blogu.

Niestety, być może brakuje tu Twojego celu; ale być może te sugestie są użyteczne. Powodzenia!

4

Mogę być tutaj niepoprawny, ale jeśli nie testujesz samej integracji LDAP, możesz wyłudzić połączenie LDAP za pomocą obiektu Mock, który zawsze zwraca oczekiwane wartości, aby inne testy jednostek mogły zostać wykonane .

Jeśli testujesz połączenie LDAP, to naprawdę wykonujesz test integracji. W takim przypadku najlepiej jest połączyć się z rzeczywistą implementacją LDAP.

2

Użytkownik może, ale nie musi wiedzieć, że wbudowana funkcja LDAP nie jest dostarczana przez samą aplikację Spring LDAP, ale Apache Directory Server. Niestety, program ładujący LDIF w Apache DS (w każdym razie podłączony przez Spring) ma bardzo słabą obsługę błędów i możliwości raportowania, i jako taki prawdopodobnie nie będzie się zachowywał tak, jak naprawdę chcesz do testu jednostkowego. Najlepszym wyjściem, jeśli naprawdę chcesz zacząć od czystej karty za każdym razem, jest przejęcie prowadzenia testów urządzeń LDAP Spring Security i ponowne zaimplementowanie Apache DS za każdym razem, z czystym ładowaniem pliku LDIF.

Możesz także całkowicie zrezygnować z LDIF i skonstruować własne opakowanie testowe, które weryfikuje warunki wstępne i końcowe danych przed rozpoczęciem testów jednostkowych. To będzie więcej pracy, ale ostatecznie może ci się lepiej udać.

1

działa dobrze dla mnie:

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

poprosiłem coś podobnego i dostał odpowiedź od Luke Taylor: Integration tests with spring-security and ldap

Powiązane problemy