Как по-другому настроить Spring @Component при тестировании - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь изучить Spring, написав приложение, которое запрашивает информацию из 2 источников LDAP через 2 класса обслуживания.

У меня есть источник ActiveDirectory:

@Component
public class AdLdapService implements LdapService {
    @Override
    public Optional<LdapMember> getUserById(String accountName) throws Exception {
    }
}

, и это настроено используя

@Configuration
public class AdLdapConfiguration {

    @Autowired
    Environment env;

    @Bean("ad-context")
    public LdapContextSource contextSource() {
        LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl(env.getRequiredProperty("ldap.ad.url"));
        contextSource.setBase(env.getRequiredProperty("ldap.ad.base"));
        contextSource.setUserDn(env.getRequiredProperty("ldap.ad.user"));
        contextSource.setPassword(env.getRequiredProperty("ldap.ad.password"));
        return contextSource;
    }

    @Bean("ad-template")
    public LdapTemplate ldapTemplate() {
        return new LdapTemplate(contextSource());
    }
}

У меня также есть вторая пара классов для доступа к другому источнику LDAP. Все это прекрасно работает.

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

Я хочу создать 2 отдельных LDAP и заполнить их из 2 файлов LDIF. Мои реализации 2 LdapService должны затем ссылаться на соответствующие встроенные LDAP.

Мои знания Spring все еще очень ограничены, и я не знаю элегантного способа настроить это.

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете начать с теста, который загрузит контекст приложения с выбранной вами конфигурацией:

@RunWith(SpringRunner.class)
@ContextConfiguration(...<YOUR_CONFIG_GOES_HERE>)
public void MySampleLdapTest {

    @Autowired
    public LdapTemplate testTemplate;

    @Test
    public void testLdap() {
      testTemplate.doWhateverYouNeedAndVerifyTheResult();
    }
}

Теперь, если вам нужно запустить службу Ldap в памяти, это, безусловно, интеграционный тест. Вы можете выполнить одно из следующих действий:

  1. Использовать платформу TestContainers для запуска образа Ldap Service Docker и взаимодействия с ним.
  2. Найти некоторую реализацию Ldap Server в памяти и интегрироваться с тестом.
  3. Используйте аннотацию @MockBean, если вы хотите смоделировать bean-компонент, который взаимодействует с LdapService, но вы все равно хотите загрузить контекст приложения с кучей ваших bean-компонентов. Это специальная аннотация, которая изменяет контекст приложения: если был компонент такого типа - вместо этого он будет помещать макет в контекст приложения (обычный макет, созданный с помощью mockito), если вообще не было компонента - он создаст в любом случае, добавьте его в контекст приложения.

И последнее, но не менее важное: все эти тесты значительно медленнее, чем обычное модульное тестирование в стиле mockito. В общем, весенние тесты - прекрасный инструмент, но он предназначен для интеграционных тестов, а не для юнит-тестов. Если вы можете провести модульное тестирование без пружины с помощью mockito - это может быть даже лучший выбор.

...