2015-07-01 14 views
17

Próbuję utworzyć prosty projekt sieciowy wiosennego rozruchu z zabezpieczeniami. Mogę uruchomić aplikację dobrze, a bezpieczeństwo działa poprawnie. Mam jednak pewne elementy, które chcę testować bez zabezpieczeń (lub w ogóle testować - nie mogę w ogóle wykonać testu).Wyłączanie zabezpieczeń w testach jednostkowych przy rozruchu sprężynowym

Otrzymuję wyjątek wskazujący, że nie można znaleźć obiektu ObjectPostProcessor, a tym samym nie można go otworzyć.

Spowodowany przez: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie kwalifikacyjna fasoli typu [org.springframework.security.config.annotation.ObjectPostProcessor] znalezionych dla uzależnienia

 
14:01:50.937 [main] ERROR o.s.boot.SpringApplication - Application startup failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fmpdfApplication.ApplicationSecurity': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setObjectPostProcessor(org.springframework.security.config.annotation.ObjectPostProcessor); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at 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] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) ~[spring-boot-1.2.4.RELEASE.jar:1.2.4.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) ~[spring-boot-1.2.4.RELEASE.jar:1.2.4.RELEASE] 
    at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:103) [spring-boot-1.2.4.RELEASE.jar:1.2.4.RELEASE] 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:200) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:259) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at 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] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:219) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at 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] 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) [spring-test-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at 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(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) [idea_rt.jar:na] 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setObjectPostProcessor(org.springframework.security.config.annotation.ObjectPostProcessor); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at 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] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    ... 43 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:606) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    ... 45 common frames omitted 

Nie jestem nawet próbuje przetestować wszystko, co dotyczy sieci, bezpieczeństwa lub czegokolwiek. Jestem tylko jednostką testującą jeden z moich komponentów. Moje testy jednostkowe (w Groovy) jest jak:

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

    @Resource PdfUpdater pdfUpdater 
    ... 

i moja (istotne) Gradle zależności są:

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") 

Próbowałem ustawienie management.security.enabled = false security.basic .enabled = false Ale to nie pomogło

Jeszcze jedna ważna informacja: musiałem dostosować zabezpieczenia, więc podążałem za wzorem:

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

Czy to jest część problemu? Czy istnieje sposób, aby to @Lazy, jeśli jest to związane?

Aktualizacja: Jeśli oznaczy test jednostki jako @WebIntegrationTest, to wszystko działa - ale uruchamia wbudowany serwer tomcat. W jaki sposób mogę wyłączyć bezpieczeństwo wiosenne dla testowania urządzeń nie internetowych?

+0

Czy FmpdfApplication makiety/test czy prawdziwe klasy Application? – ikumen

Odpowiedz

15

FmpdfApplication jest prawdopodobne, opatrzone @EnableAutoConfiguration (lub z @SpringBootApplication który jest meta-opatrzone @EnableAutoConfiguration), a to doprowadzi do wiosny zabezpieczeń są zabierani i konfigurowane za pomocą auto-konfiguracji.

Jeśli chcesz zobaczyć, co jest automatycznie konfigurowane, uruchom swoją aplikację internetową i uzyskaj dostęp do punktu końcowego autoconfig (np. http://localhost:8080/autoconfig). Następnie wyszukaj "Security", aby zobaczyć, które klasy "AutoConfiguration" są wykrywane.

Można wtedy wyłączyć automatyczną konfigurację zabezpieczeń, z wyłączeniem tych klas tak:

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

Oczywiście, nie będzie chciał wyłączyć je dla wdrożeń produkcyjnych. Dlatego musisz mieć oddzielną klasę @Configuration do produkcji i testów.

Pozdrawiam,

Sam

PS: Pomocna może być również moja odpowiedź na następujące pytanie: Spring-Boot module based integration testing

+0

Trzeba tylko pamiętać, że @EnableAutoConfiguration (exclude = {SecurityAutoconfiguration.class, ManagementWebSecurityAutoConfiguration.class}) będzie na twojej adnotowanej klasie @SpringBootApplication w src/test/java. Zwróć też uwagę na użycie ManagementWebSecurityAutoConfiguration.class (używam wiosennego rozruchu 1.3.0) –

20

Wyjątkiem masz jest bardzo różne od tego, co ja trafiałem, ale jeśli chcesz wyłączyć bezpieczeństwa podczas jazdy przypadków testowych, można próbując przy użyciu profili i wyłączanie zabezpieczenia podstawowego z wykorzystaniem właściwości profilu testowym. To, co zrobiłem -

  1. Dodane adnotacji @Profile(value = {"development", "production"}) do mojego realizacji WebSecurityConfigurerAdapter -

    @Configuration 
    @EnableWebSecurity 
    @Profile(value = {"development", "production"}) 
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    
  2. Teraz w test/resources utwórz application-test.yml zdefiniowanie właściwości profilu testowym i dodaj -

    # Security enable/disable 
    security: 
        basic: 
        enabled: false 
    
  3. Teraz do swoich przypadków testowych dodaj tę adnotację, aby zastosować aktywny profil @ActiveProfiles(value = "test"). Jest to, jak wyglądała moja klasa -

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

Spowoduje to wyłączone zabezpieczenie dla moich testów i byłem w stanie uzyskać dostęp do stron wymagających autoryzacji. Mam nadzieję, że to zadziała również dla ciebie. Powodzenia!!!

+0

Podoba mi się to rozwiązanie, dzięki! –

+0

najlepsze rozwiązanie kiedykolwiek –

+0

Zaakceptowana odpowiedź nie działa dla mnie, używam OAuth2 i robię to na serwerze zasobów, więc dodałem adnotację @ Profile do przez ResourceServerConfigurerAdapter, ale reszta jest taka sama i działa idealnie. – 3urdoch

0

Jeśli aplikacja nie była internetowej bazy ale trzeba słoik sprężynowy zabezpieczający jako uzależnienia i nie chcesz konfiguracje auto wiosenno-Boot dla wiosny bezpieczeństwa podczas testowania można dodać

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

w twojej klasie testowej.

0

Dla mnie poprawka polegała na aktualizacji moich adnotacji testowych. Wymieniłem:

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

z

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ContextConfiguration(classes = MyApplication.class) 
Powiązane problemy