2015-07-01 18 views
17

Sto provando a creare un semplice progetto Web di avvio a molla con sicurezza. Posso avviare l'applicazione e la sicurezza funziona correttamente. Tuttavia, ho alcuni componenti che voglio testare senza sicurezza (o test del tutto - non riesco a far funzionare il test).Disabilitare la sicurezza per i test unitari con avvio a molla

Ricevo un'eccezione che indica che non è possibile trovare un ObjectPostProcessor e che quindi non può aprire il contenitore.

causati da: org.springframework.beans.factory.NoSuchBeanDefinitionException: No fagiolo qualificazione di tipo [org.springframework.security.config.annotation.ObjectPostProcessor] trovato per la dipendenza

 
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 

Non sono nemmeno cercando di testare qualsiasi cosa relativa al web o alla sicurezza o altro. Sto solo testando uno dei miei componenti. La mia prova Unità (in Groovy) è simile:

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

    @Resource PdfUpdater pdfUpdater 
    ... 

E la mia (rilevanti) le dipendenze Gradle sono:

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

ho provato a fissare management.security.enabled = false security.basic .enabled = false Ma questo non ha aiutato

Un altro po 'di informazioni rilevanti: avevo bisogno di personalizzare la sicurezza così ho seguito il modello a:

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

Questa parte del problema? C'è un modo per rendere questo @ Pigro se questo è correlato?

Aggiornamento: se contrassegno l'unit test come @WebIntegrationTest, tutto funziona ma avvia un server tomcat incorporato. Come posso disabilitare la sicurezza di primavera per testare le unità non web?

+0

Is FmpdfApplication finto/prova o reale Classe di applicazione? – ikumen

risposta

15

FmpdfApplication è probabilmente annotato con @EnableAutoConfiguration (o con @SpringBootApplication che è meta-annotato con @EnableAutoConfiguration), e questo porterà a Primavera di sicurezza in fase di raccolto e configurato tramite la configurazione automatica.

Se si desidera vedere cosa viene configurato automaticamente, avviare l'app Web e accedere all'endpoint(ad esempio, http://localhost:8080/autoconfig). Quindi cerca "Sicurezza" per vedere quali classi di "AutoConfigurazione" vengono rilevate.

È quindi possibile disattivare la configurazione automatica di sicurezza escludendo quelle classi in questo modo:

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

Naturalmente, non si vuole escludere loro per distribuzioni di produzione. Quindi avrai bisogno di una classe @Configuration separata per produzione e test.

saluti,

Sam

P.S. È anche utile trovare la mia risposta alla seguente domanda: Spring-Boot module based integration testing

+0

Basta notare che @EnableAutoConfiguration (exclude = {SecurityAutoconfiguration.class, ManagementWebSecurityAutoConfiguration.class}) si troverà nella classe annotata @SpringBootApplication in src/test/java. Nota anche l'uso di ManagementWebSecurityAutoConfiguration.class (sto usando spring boot 1.3.0) –

20

L'eccezione che si ottiene è molto diverso da quello che mi è stato sempre, ma se si desidera disattivare la sicurezza durante l'esecuzione di casi di test, è possibile provare utilizzando i profili e disabilitando la sicurezza di base utilizzando le proprietà per il profilo di prova. Questo è quello che ho fatto -

  1. Aggiunto annotazione @Profile(value = {"development", "production"}) alla mia attuazione WebSecurityConfigurerAdapter -

    @Configuration 
    @EnableWebSecurity 
    @Profile(value = {"development", "production"}) 
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    
  2. Ora, in test/resources, creare application-test.yml per definire le proprietà di profilo di prova e aggiungere questo -

    # Security enable/disable 
    security: 
        basic: 
        enabled: false 
    
  3. Ora, per i casi di test, aggiungere questa annotazione per applicare il profilo attivo @ActiveProfiles(value = "test"). Questo è come la mia classe sembrava -

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

Facendo questo disabilitata la sicurezza per i miei casi di test e sono stato in grado di accedere agli URL autenticati. Spero che questo funzioni anche per te. Buona fortuna!!!

+0

Anche questa soluzione mi piace, grazie! –

+0

soluzione migliore in assoluto –

+0

La risposta accettata non ha funzionato per me, sto utilizzando OAuth2 e lo faccio su un server di risorse, quindi ho aggiunto l'annotazione @Profile a ResourceServerConfigurerAdapter ma il resto è lo stesso e funziona perfettamente. – 3urdoch

0

Se l'applicazione non è stata di base web, ma è necessario vaso primavera-protezione come dipendenza e non si vuole configurazioni auto della primavera-boot per la primavera-sicurezza durante il test, è possibile aggiungere

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

nella vostra classe di test.

0

Per me, la correzione era di aggiornare le mie annotazioni di prova. Ho sostituito:

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

con

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