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