Я пишу интеграционные тесты для своего 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 для тестирования потока интеграции.
Код для интерфейсов, а не для реализации.
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
}
}
Тестирование без интеграции.
@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
потокобезопасным? Если нет, вам, вероятно, потребуется реализовать пул соединений.