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

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

Я получаю исключение, указывающее, что он не может найти ObjectPostProcessor и, следовательно, не может вызвать контейнер.

Вызывается: org.springframework.beans.factory.NoSuchBeanDefinitionException: нет соответствующего компонента типа [org.springframework.security.config.annotation.ObjectPostProcessor], найденного для зависимости

 14: 01: 50.937 [main] ОШИБКА osboot.SpringApplication - Ошибка запуска приложения. Org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем «fmpdfApplication.ApplicationSecurity»: не удалось выполнить автоматическое зависание;  Вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось использовать метод autowire: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setObjectPostProcessor (org.springframework.security.config.annotation.ObjectPostProcessor) ;  Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не существует определяющего компонента типа [org.springframework.security.config.annotation.ObjectPostProcessor], найденного для зависимостей: ожидается как минимум 1 компонент, который квалифицируется как кандидат autwire для этой зависимости.  Аннотации зависимостей: {} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:334) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.springframework .beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1210) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory. doCreateBean (AbstractAutowireCapableBeanFactory.java:537) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:476) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:303) ~ [spring-beans-4.1.6 .RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.DefaultSin  gletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:299 ) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:194) ~ [spring-beans-4.1. 6.RELEASE.jar: 4.1.6.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:755) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6 .RELEASE] в org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:757) ~ [spring-context-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.context.support .AbstractApplicationContext.refresh (AbstractApplicationContext.java:480) ~ [spring-context-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.boot.SpringApplication.ref  resh (SpringApplication.java:686) ~ [spring-boot-1.2.4.RELEASE.jar: 1.2.4.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:320) ~ [spring-boot -1.2.4.RELEASE.jar: 1.2.4.RELEASE] в org.springframework.boot.test.SpringApplicationContextLoader.loadContext (SpringApplicationContextLoader.java:103) [spring-boot-1.2.4.RELEASE.jar: 1.2.4 .RELEASE] в org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal (DefaultCacheAwareContextLoaderDelegate.java:68) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context. DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:86) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.DefaultTestContext.getApplicationContext (DefaultTestContext.java:72) [spring -test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies (Depende  ncyInjectionTestExecutionListener.java:117) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance (DependencyInjectionTestExecutionListener.java:83) [spring-test -4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.TestContextManager.prepareTestInstance (TestContextManager.java:212) [spring-test-4.1.6.RELEASE.jar: 4.1.6 .RELEASE] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest (SpringJUnit4ClassRunner.java:200) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test. context.junit4.SpringJUnit4ClassRunner $ 1.runReflectiveCall (SpringJUnit4ClassRunner.java:259) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable .java: 12) [junit-4.12.jar: 4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock (SpringJUnit4ClassRunner.java:261) [spring-test  -4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:219) [spring-test-4.1.6.RELEASE.jar: 4.1 .6.RELEASE] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:83) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.junit. runners.ParentRunner $ 3.run (ParentRunner.java:290) [junit-4.12.jar: 4.12] at org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) [junit-4.12.jar: 4.12] at org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) [junit-4.12.jar: 4.12] at org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) [junit-4.12.jar: 4.12] at org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) [junit-4.12.jar: 4.12] at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java: 61) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.test.context.j  unit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:68) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.junit.runners.ParentRunner.run (ParentRunner.java:363) [junit-4.12.jar: 4.12] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:163) [spring-test-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.junit.runner.JUnitCore.run (JUnitCore.java:137) [junit-4.12.jar: 4.12] at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:78) [junit-rt.jar: na ] at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:212) [junit-rt.jar: na] at com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java: 68) [junit-rt.jar: na] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_45] at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [na: 1.8.0_45] на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMet  hodAccessorImpl.java:43) ~ [na: 1.8.0_45] в java.lang.reflect.Method.invoke (Method.java:497) ~ [na: 1.8.0_45] в com.intellij.rt.execution.application. AppMain.main (AppMain.java:140) [idea_rt.jar: na] Вызвано: org.springframework.beans.factory.BeanCreationException: Не удалось использовать метод autowire: public void org.springframework.security.config.annotation.web.configuration .WebSecurityConfigurerAdapter.setObjectPostProcessor (org.springframework.security.config.annotation.ObjectPostProcessor);  Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не существует определяющего компонента типа [org.springframework.security.config.annotation.ObjectPostProcessor], найденного для зависимостей: ожидается как минимум 1 компонент, который квалифицируется как кандидат autwire для этой зависимости.  Аннотации зависимостей: {} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredMethodElement.inject (AutowiredAnnotationBeanPostProcessor.java:649) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] at org .springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:88) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.nnation. AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:331) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] ... 43 общих фрейма пропущены Причина: org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет подходящего компонента типа [org.springframework.security.config.annotation.ObjectPostProcessor], найденного для зависимостей: ожидается как минимум 1 компонент, который квалифицируется как кандидат autwire для этой зависимости.  Аннотации зависимостей: {} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1301) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] на org.springframework .beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1047) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory. resolveDependency (DefaultListableBeanFactory.java:942) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredMethodElement.inject (AutowiredAnnotationBeanPostProcessor.java:606 ) ~ [spring-beans-4.1.6.RELEASE.jar: 4.1.6.RELEASE] ... 45 общих кадров опущены 

Я даже не пытаюсь проверить что-либо, связанное с сетью или безопасностью, или что-то еще. Я просто тестирую один из моих компонентов. Мое модульное тестирование (в паре) выглядит так:

@RunWith(SpringJUnit4ClassRunner) @SpringApplicationConfiguration(classes = FmpdfApplication) @ActiveProfiles(["test", "mockstore"]) class PdfUpdaterTest { @Resource PdfUpdater pdfUpdater ... 

И мои (соответствующие) зависимости gradleиентов:

 compile("org.springframework.boot:spring-boot-starter-actuator") compile("org.springframework.boot:spring-boot-starter-security") compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-jdbc") testCompile("org.springframework.boot:spring-boot-starter-test") 

Я пробовал установку management.security.enabled = false security.basic.enabled = false Но это не помогло

Еще один соответствующий бит информации: мне нужно было настроить безопасность, чтобы я следил за шаблоном:

 @Configuration @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter { @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { .. 

Это часть проблемы? Есть ли способ сделать этот @Lazy, если это связано?

Обновление. Если я пометить модульный тест как @WebIntegrationTest, тогда все будет работать, но он запустит встроенный сервер tomcat. Как отключить весеннюю безопасность для модульного тестирования не веб-сайтов?

FmpdfApplication , скорее всего, аннотируется с @EnableAutoConfiguration (или с помощью @SpringBootApplication который мета-аннотируется с @EnableAutoConfiguration ), и это приведет к тому, что Spring Security будет поднята и настроена с помощью автоматической настройки.

Если вы хотите узнать, что настроено автоматически, запустите свое веб-приложение и получите доступ к конечной точке autoconfig (например, http: // localhost: 8080 / autoconfig ). Затем найдите «Безопасность», чтобы узнать, какие classы «AutoConfiguration» обнаруживаются.

Затем вы можете отключить автоматическую настройку безопасности, исключив эти classы следующим образом:

 @EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, ManagementSecurityAutoConfiguration.class }) 

Конечно, вы не захотите исключать их для развертывания производства. Таким образом, для производства и тестирования вам понадобится отдельный class @Configuration .

С Уважением,

Сэм

ps. Вы также можете найти мой ответ на следующий вопрос, полезный также: тестирование интеграции на основе Spring-Boot

Исключение, которое вы получаете, сильно отличается от того, что я получаю, но если вы хотите отключить безопасность во время выполнения тестовых примеров, вы можете попробовать использовать профили и отключить базовую безопасность, используя свойства для тестового профиля. Это то, что я сделал –

  1. Добавлена ​​аннотация @Profile(value = {"development", "production"}) к моей реализации WebSecurityConfigurerAdapter
  @Configuration @EnableWebSecurity @Profile(value = {"development", "production"}) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

2. Теперь в test/resources создайте application-test.yml для определения свойств для тестового профиля и добавьте это –

  # Security enable/disable security: basic: enabled: false 

3. Теперь, в ваши тестовые примеры, добавьте эту аннотацию, чтобы применить активный профиль @ActiveProfiles(value = "test") . Так выглядел мой class –

  @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @ActiveProfiles(value = "test") @IntegrationTest({"server.port=0"}) public class SampleControllerIntegrationTest { 

При этом отключена безопасность для моих тестовых примеров, и я смог получить доступ к аутентифицированным URL-адресам. Надеюсь, это сработает и для вас. Удачи!!!

Попробуйте с Spring Security @WithMockUser чтобы быстро издеваться над пользователем в тестах.

http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test

Если ваша заявка не была веб-базой, но вам нужна пружинная банка безопасности в качестве зависимости, и вы не хотите, чтобы автоконфигурации пружинной загрузки для весенней безопасности во время тестирования, вы можете добавить

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

в вашем тестовом classе.

Для меня было исправлено обновление моих аннотаций. Я заменил:

 @SpringApplicationConfiguration(classes = { MyApplication.class }) @RunWith(SpringJUnit4ClassRunner.class) 

с

 @RunWith(SpringRunner.class) @SpringBootTest @ContextConfiguration(classes = MyApplication.class) 

Попробуйте это, чтобы отключить безопасность загрузки весны для тестирования


@AutoConfigureMockMvc (secure = false)

 @RunWith(SpringRunner.class) @WebMvcTest(SampleController.class) @AutoConfigureMockMvc(secure = false) public class SampleControllerIntegrationTest { 
  • исключить @Component из @ComponentScan
  • @Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?
  • Spring + Web MVC: dispatcher-servlet.xml и applicationContext.xml (плюс общая безопасность)
  • Setter DI или Constructor DI весной?
  • Невозможно Autowire @Repository аннотированный интерфейс в Spring Boot
  • Как использовать Spring Security без сеансов?
  • Загрузка файлов с помощью API-интерфейса Angular2 в REST
  • Spring Security и @Async (перепутаны проверенные пользователи)
  • Как установить заголовок «Принять:» в запросе Spring RestTemplate?
  • Безопасность Springboot не работает
  • Весенний язык выражений (SpEL) с @Value: доллар против hashа ($ против #)
  • Interesting Posts

    ПК Windows 7 часто зависает при постоянном освещении жесткого диска

    освежающий цвет фона для строки в jtable

    Докер не может вытащить изображения

    spring Exception при запуске приложения в WebSphere с java 8

    Какая разница в том, использует ли компьютер USB-адаптер Ethernet или сетевую карту?

    «Сеть недоступна» при попытке выполнить ping google, но внутренние адреса работают

    Как сделать .lib-файл, когда есть .dll-файл и заголовочный файл

    Удаление среднего узла из одного связанного списка, когда указатель на предыдущий узел недоступен

    Сложность выполнения таблицы hash-таблицы (вставка, поиск и удаление)

    log4j: привязка к конкретному пакету

    C # – Несколько общих типов в одном списке

    Visual Studio, по-видимому, случайно использует американскую раскладку клавиатуры

    Фоновый оттенок Lollipop не влияет на кнопку

    Как создать случайную буквенно-цифровую строку в C ++?

    Каково использование ключевого слова `inline` в C?

    Давайте будем гением компьютера.