Запуск приложения Spring Boot через Eclipse поднимает тестовые классы

Я разрабатываю приложение Spring Boot, используя STS с плагином Gradle. У меня другая конфигурация для тестов, чтобы нашим тестам Selenium не приходилось входить в систему.

Итак, в src/test/java/etc у меня есть что-то вроде этого:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
public static class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {   
        http.authorizeRequests().anyRequest().permitAll();
    }
}

Принимая во внимание, что в src/main/java у меня есть эквивалентный класс, который настраивает вход в систему и т. д., требуя входа для всех страниц.

Если я запускаю приложение через плагин Gradle (bootRun), все работает нормально.

Однако, если я запускаю или отлаживаю его через Eclipse напрямую (например, щелкнув правой кнопкой мыши проект, Run As-> Spring Boot App или нажав кнопки запуска/отладки в представлении Spring или Java), тогда применяется тестовая конфигурация, поэтому доступ предоставляется всем страницам без входа в систему.

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


person Martin Wilson    schedule 14.11.2015    source источник
comment
Я мог бы представить, что вы могли бы обойти это, добавив @Profile("test") к этому классу + @ActiveProfiles("test") в тесте. Это сделало бы компонент условным в этом профиле. См. docs.spring.io/spring/docs/current/spring-framework-reference/   -  person zapl    schedule 14.11.2015
comment
Выглядит как хорошее потенциальное решение, хотя даже после того, как я добавил @profile(test) в тестовый класс конфигурации, он все еще используется при запуске приложения. Я изучу это позже - спасибо.   -  person Martin Wilson    schedule 14.11.2015
comment
Я могу подтвердить, что проблема почти наверняка в том, что путь к классам среды выполнения включает в себя «тестовые» вещи. Это известная проблема, хотя я не думаю, что для нее есть проблема. Это проблема, вызванная тем, что модель инструментов gradle не различает пути к классам «test» и «runtime». Боюсь, самый простой способ избежать этой проблемы — перейти на использование maven. Я знаю, что m2e/maven делает это правильно.   -  person Kris    schedule 16.11.2015
comment
Спасибо @Kris - на данный момент я обошел это, убрав необходимость в отдельной конфигурации для тестов.   -  person Martin Wilson    schedule 16.11.2015
comment
Я написал некоторый код в моем файле build.gradle, который генерирует конфигурацию запуска Eclipse с использованием пути к классам среды выполнения. Я использую эту конфигурацию запуска для запуска моего локального сервера приложений. См. stackoverflow.com/a/40646309/1423583.   -  person Nathan    schedule 17.11.2016
comment
Я использую maven и у меня такая же проблема.   -  person KSobkowiak    schedule 30.11.2016


Ответы (2)


Когда вы запускаете тест из eclipse, путь к классам подготавливается eclipse (а не maven или gradle).

Eclipse использует только один путь к классам для каждого проекта и ничего не знает об областях зависимостей (например, «компилировать» или «тестировать»). Таким образом, путь к классам всегда содержит любые ресурсы ссылочного проекта.

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

person Stefan Isele - prefabware.com    schedule 09.04.2017

Вы можете добавить @TestComponent к вашему тестовому классу конфигурации. Эти конфигурации bean-компонентов будут пропущены при сканировании компонентов вашего приложения. В зависимости от конфигурации сканирования компонентов вам необходимо определить фильтр исключения @ComponentScan: excludeFilters = @ComponentScan.Filter(value = TestComponent.class, type = FilterType.ANNOTATION))

person StefanR    schedule 21.07.2017
comment
Это работает, но с этим подходом есть одна проблема: вам нужно добавить класс весеннего теста в производство, иначе вы получите ClassNotFoundException - person Wellington Souza; 22.11.2017
comment
@WellingtonSouza, это правда. В качестве альтернативы вы также можете использовать выражение регулярного выражения для исключения тестовых классов, например. excludeFilters = @ComponentScan.Filter(pattern = ".*TestConfiguration", type = FilterType.REGEX) - person StefanR; 24.11.2017