Spring встроенный сервер ldap в модульных тестах

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

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

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

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

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

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

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

Спасибо


person Kent Lai    schedule 13.02.2009    source источник


Ответы (4)


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

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

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

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

person Community    schedule 16.09.2009

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

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

person Kevin Williams    schedule 21.11.2009

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

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

person Peter Mularien    schedule 05.12.2009

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

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

Я спросил нечто подобное и получил ответ от Люка Тейлора: Интеграционные тесты с spring-security и ldap

person static-max    schedule 20.11.2012