在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?相关的知识,希望对你有一定的参考价值。

我正在为我的API编写集成测试。我必须测试流程,这就是我实现内存中的ldap的原因。我使用了InMemoryDirectoryServer,它返回LDAPConnection对象用于内存操作。但是在我的LDAPService中,我编写了函数getLdapConnection,它返回LDAPConnection,此函数用于LDAP操作。

那么如何将内存中的LDAPConnection对象传递给我的LDAP服务,以便每个操作都将采用内存中的LDAPConnection对象进行集成测试?

我尝试为自动装配的LDAPConnection对象创建setter方法。

//Test class
public class LdapInMem
{
    InMemoryDirectoryServer server;
    public LDAPConnection startInMemLdapServer() throws UnknownHostException
    {
           //some in memory listener config
           return ldapConnection;
    }
}
@Service
@Repository
public class LDAPService
{   
    @Autowired
    private LDAPServerConfig ldapServerConfig;

    private LDAPConnection ldapConnection;
    public LDAPConnection getLDAPConnection()
    {
          //some server config from  ldapServerConfig
          return ldapConnection;
    }
    public function()
    {
       con = getLDAPConnection();
       con.do_ldap_stuff
    }
    public function1()
    {
       con = getLDAPConnection();
       con.do_ldap_stuff1
    }
}
//LDAP service
    public void setLdapConnection(LDAPConnection ldapConnection)
    {
        this.ldapConnection = ldapConnection;
    }

我的测试用例如何在测试时从内存设置中设置LDAPService的ldapConnection对象,并且通常在运行应用程序时从LDAPService设置?所以我可以在流程中测试我的函数和function1。我希望我的API为每个LDAP操作使用内存中的LDAPConnection对象来测试集成流。

答案

代码到接口而不是实现。

public interface LDAPConnectionSource {

    LDAPConnection getLDAPConnection();

}

使用Spring Profiles确定要在运行时运行的实现。

@Service
@Profile("integration")
public class LdapInMem implements LDAPConnectionSource
{
    InMemoryDirectoryServer server;

    @PostConstruct
    public void startInMemLdapServer() throws UnknownHostException
    {
           //some in memory listener config
    }

    public LDAPConnection getLDAPConnection() {
        return server.getConnection();  // or what ever returns a LDAPConnection
    }
}

非集成测试impl。

@Service
@Profile("!integration")
public class LDAPService
{   
    @Autowired
    private LDAPServerConfig ldapServerConfig;

    private LDAPConnection ldapConnection;

    public LDAPConnection getLDAPConnection()
    {
          //some server config from  ldapServerConfig
          return ldapConnection;
    }
}

客户端只需自动连接界面:

public class LDAPConnectionClient {

    @Autowired
    LDAPConnectionSource source;

    public void doLDAPStuff() {
        LDAPConnection ldapConnection = source.getLDAPConnection();
        //do stuff with the connection
    }
}

关于您的实现需要考虑的其他一些事项。 LDAPConnection线程安全吗?如果没有,您可能需要实现连接池。

以上是关于在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 集成测试中使用嵌入式 MongoDB

Shiro:Spring-boot如何集成Shiro(上)

在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?

在 Spring Boot 集成测试中使用 TestContainer 填充数据库

如何调试,为啥 Spring Boot 集成测试上下文没有在测试之间重用?

如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?