Интеграционные тесты с spring-security и ldap
Spring встроил ldap сервер в юнит-тесты похоже, однако ответа не было дано, что меня устраивает.
Я могу без проблем запускать свои интеграционные тесты с помощью Spring и встроенного ldap-сервера Spring-Security. Тем не менее, я неПока еще не найдется способ очистить встроенный ldap-сервер и снова загрузить ldif, чтобы обеспечить общую среду тестирования.
LdapTestUtils из spring-ldap предоставляет метод cleanAndSetup (). Однако это не работает с предложенной версией (1.5.5) apache-ds, так как LdifFileLoader теперь требуетCoreSession вместоDirContext предоставлено LdapTestUtils. Это вызывает
java.lang.NoSuchMethodError:
org.apache.directory.server.protocol.shared.store.LdifFileLoader.(Ljavax/naming/directory/DirContext;Ljava/lang/String;)
Мне нужен только метод, который очищает встроенный сервер ldap и снова заполняет его файлом ldif (как это делается при запуске). У кого-нибудь есть идеи по этому поводу?
Версия: spring 3.1, spring-ldap 1.3, spring-security 3.1, apache-ds 1.5.5
Решение (спасибо Люку Тейлору):
@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
}
}
}