2015-11-14 1 views
8

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

Так в 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 напрямую (например, щелкнув правой кнопкой мыши по проекту, запустив As-> Spring Boot App или нажав кнопки запуска/отладки в представлении Spring или Java), тогда тестовая конфигурация , поэтому доступ предоставляется всем страницам без входа.

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

+1

Я мог представить, что вы могли бы обходным путем, добавив '@Profile (" test ")' этому классу + '@ActiveProfiles (" test ")' на тест. Это сделало бы bean condinional для этого профиля. См. Http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-ctx-management-env-profiles – zapl

+0

Похож на хорошее потенциальное решение, хотя даже после того, как я добавил @profile («test») в тестовый конфигурационный класс, он все еще используется, когда я запускаю приложение. Я исследую это позже - спасибо. –

+2

Я могу подтвердить, что проблема почти наверняка заключается в том, что путь к классу runtime включает в себя «тестовые» вещи. Это своего рода известная проблема, хотя я не думаю, что для нее есть билет с вопросом. Это проблема, вызванная моделью инструментальной модели gradle, не отличающейся между классами «test» и «runtime». Я боюсь, что самый простой способ избежать этой проблемы - переключиться на использование maven. Я знаю, что m2e/maven делает это правильно. – Kris

ответ

2

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

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

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

0

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

+0

Это работает, но есть одна проблема с этим подходом: вы должны добавить весенний тестовый класс в производство, иначе вы получите ClassNotFoundException –

+0

@WellingtonSouza, это правда. В качестве альтернативы вы также можете использовать выражение regexp для исключения тестовых классов, например.'excludeFilters = @ ComponentScan.Filter (pattern =". * TestConfiguration ", type = FilterType.REGEX)' – StefanR

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

  • Нет связанных вопросов^_^