Spring встроил ldap сервер в юнит-тесты - PullRequest
7 голосов
/ 13 февраля 2009

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

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

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

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

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

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

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 21 ноября 2009

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

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

3 голосов
/ 17 сентября 2009

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

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

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

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

2 голосов
/ 05 декабря 2009

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

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

1 голос
/ 20 ноября 2012

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

@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

...