2009-02-13 120 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