2009-02-13 5 views
5

В настоящее время я пытаюсь использовать встроенный сервер ldap для модульных тестов.Весенний встроенный сервер ldap в модульных тестах

В Spring Security вы можете быстро определить встроенный сервер ldap для тестирования с тегом с некоторыми образцами данных, загруженными из указанного ldif.

Я буду использовать Spring Ldap для выполнения операций ldap и думать о проверке обычных функций CRUD моего объекта обслуживания пользователей.

Есть ли способ гарантировать, что записи на встроенном сервере должны находиться в одном и том же состоянии (вроде как удалить все и перезагрузить записи ldif) для каждого теста, который я запускаю?

Я подумал следующее: 1) Указывает, что метод пачкает контекст, и заставить воссоздание встроенного сервера LDAP, который звучит болезненным, как это было бы необходимо перезапустить сервер для каждого метода 2) Создайте тестовые записи в тестовой организации, так что я могу развязать их и просто загрузить в файл ldif снова там.

Я предпочитаю 2, но похоже, что Spring LDAP не имеет полезных помощников для загрузки и отправки содержимого ldif-файла.

Любые предложения о том, как вы выполняете тестирование ldap со встроенным сервером ldap весны или двумя возможными решениями, о которых я упоминаю?

Благодаря

ответ

3

Не Spring LDAP обеспечивают контроль транзакций вокруг операций LDAP? Если да, почему бы не использовать Spring test framework с возможностью автоматического отката?

Я также знаю драйвер моста JDBC-LDAP, который обертывает репозиторий LDAP, представляя его как реляционную базу данных. Я использовал iBatis для подключения к этому (я написал это в http://lokibear.blogspot.com, см. Статьи с июля). Я еще не пробовал применять транзакционный контроль, но на сайте для водителя упоминается способность игнорировать транзакции (это значит, что вы также можете не игнорировать их ... правильно?).

Как я уже сказал, я еще не пробовал это; но если это обеспечивает транзакции вокруг LDAP, то вы можете снова использовать платформу тестирования Spring, чтобы получить автоматический откат на месте. Я поместил быстрый обманщик вокруг этой структуры - см. Сентябрьские сообщения в моем блоге.

Извините, у меня может быть отсутствует ваша цель; но, возможно, эти предложения полезны. Удачи!

4

Возможно, здесь я не могу отследить, но если вы не тестируете интеграцию LDAP, вы можете выставить соединение LDAP с объектом Mock, который всегда возвращает ожидаемые значения, чтобы ваши другие тесты Unit могли завершиться ,

Если вы тестируете соединение LDAP, вы действительно выполняете интеграционный тест. В этом случае, вероятно, лучше всего подключиться к реальной реализации LDAP.

2

Вы можете или не знать, что встроенная функция LDAP не предоставляется самим Spring LDAP, но Apache Directory Server. К сожалению, загрузчик LDIF в Apache DS (в любом случае, связанный с Spring) имеет очень плохую работу по обработке ошибок и отчетности, и, как это, вероятно, не будет вести себя так, как вы действительно хотите для модульного теста. Лучше всего, если вы действительно хотите начать с чистого листа каждый раз, чтобы взять на себя лидерство тестов Spring Security LDAP и повторно инициализировать Apache DS каждый раз с чистой загрузкой файла LDIF.

В качестве альтернативы вы можете вообще отказаться от LDIF и создать свою собственную единичную тестовую оболочку, которая проверяет предварительные и последующие условия данных перед запуском ваших модульных тестов. Это будет больше работы, но в конечном итоге может работать лучше для вас.

1

отлично работает для меня:

@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 
     } 
    } 
} 

я спросил что-то подобное и получил ответ от Люк Тейлор: Integration tests with spring-security and ldap

Смежные вопросы