В java Spring Boot, как передать объект LdapConnection в памяти ldapService при интеграционном тестировании?

#java #spring-boot #integration-testing #in-memory #unboundid-ldap-sdk

#java #spring-boot #интеграция-тестирование #в памяти #unboundid-ldap-sdk

Вопрос:

Я пишу интеграционные тесты для своего API. Мне нужно протестировать поток, поэтому я внедрил ldap в памяти. Я использовал InMemoryDirectoryServer, который возвращает объект LdapConnection для операций в памяти. Но в моем LDAPService я написал функцию getLdapConnection, которая возвращает LdapConnection , эта функция используется для операций LDAP.

итак, как мне передать объект LdapConnection в памяти моим LDAPServices, чтобы каждая операция принимала объект LdapConnection в памяти для интеграционного тестирования?

Я попытался создать метод установки для объекта LdapConnection с автоматической проводкой.

 //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;
    }
  

как мои тестовые сценарии могут устанавливать объект LdapConnection LDAPService из настройки в памяти во время тестирования и, как правило, из LDAPService во время запуска приложения?
Таким образом, я могу протестировать свою функцию и function1 в потоке.
Я ожидаю, что мой API будет использовать объект LdapConnection в памяти для каждой операции LDAP для тестирования потока интеграции.

Ответ №1:

Код для интерфейсов, а не для реализаций.

 public interface LDAPConnectionSource {

    LDAPConnection getLDAPConnection();

}
  

Используйте профили Spring, чтобы определить, какую реализацию вы хотите запустить во время выполнения.

 @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 Безопасен ли поток? Если нет, вам, вероятно, потребуется реализовать пул соединений.