2009-02-13 97 views
5

我目前正在嘗試使用嵌入式ldap服務器進行單元測試。單元測試中的彈簧嵌入式ldap服務器

在Spring Security,您可以快速定義嵌入式LDAP服務器與從指定LDIF加載一些示例數據的標籤測試。

我將使用Spring Ldap來執行ldap操作,並考慮測試用戶服務對象的通常CRUD功能。

但是,是否存在一種方法可以確保嵌入式服務器中的條目對於我正在運行的每個測試都處於相同的一致狀態(有點像刪除全部並重新加載ldif條目)?

我認爲如下: 1)表明,該方法弄髒的範圍內,並迫使嵌入式LDAP服務器,這聽起來痛苦的娛樂,因爲它必須重新啓動服務器爲每個方法 2)創建測試組織中的測試條目,這樣我可以解除它們的綁定,並在那裏再次加載ldif文件。

我喜歡2,但它似乎像春天LDAP沒有的好幫手加載和跨ldif文件的內容發送。

有關如何使用spring的嵌入式ldap服務器執行ldap測試的任何建議,或者我提到的兩種可能的解決方案?

謝謝

回答

3

不是Spring LDAP提供LDAP操作的事務控制嗎?如果是這樣,爲什麼不使用Spring自動回滾功能的測試框架?

我也知道一個JDBC-LDAP橋接驅動程序,它封裝了一個LDAP存儲庫,將其作爲關係數據庫呈現。我已經使用iBatis連接到這個(我已經寫在http://lokibear.blogspot.com,看到7月的文章)。我還沒有嘗試應用交易控制,但司機的網站提到忽略交易的能力(這意味着你也可以而不是忽略他們......對嗎?)。

就像我說的,我還沒有嘗試過;但是,如果這提供了有關LDAP的事務,那麼您可以再次使用Spring測試框架來實現自動回滾。我已經圍繞這個框架提出了一個快速的備忘錄 - 請參閱我博客上的九月帖子。

對不起,我可能在這裏想念你的目標;但也許這些建議是有用的。祝你好運!

4

我可能會偏離軌道在這裏,但如果你沒有測試LDAP集成本身,你可以模擬出一個模擬對象,總是返回你希望讓你的其他單元測試可以完成值的LDAP連接。

如果您正在測試LDAP連接,那麼您確實在進行集成測試。在這種情況下,最好連接到真正的LDAP實現。

2

您可能會也可能不知道Spring LDAP本身並不提供嵌入式LDAP功能,但Apache Directory Server。不幸的是,Apache DS中的LDIF加載器(無論如何都是由Spring連接的)具有非常差的錯誤處理和報告功能,因此可能不會像單元測試那樣行事。最好的選擇是,如果您真的想每次都從乾淨的版本開始,那麼每次都要帶領乾淨的LDIF文件加載,從而帶頭進行Spring Security LDAP單元測試並重新初始化Apache DS。

或者,您可以完全避免LDIF並構建您自己的單元測試包裝,以在您的單元測試運行之前驗證數據的前置條件和後置條件。這將是更多的工作,但最終可能會爲你更好地工作。

1

正常工作:

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

我問類似的東西,並得到了盧克·泰勒的回答:Integration tests with spring-security and ldap