2013-04-21 13 views
12

Sto provando a creare i test spring-mvc utilizzando Spring 3.2.1. Seguendo alcuni tutorial, ho pensato che sarebbe stato semplice.@WebAppConfiguration non iniettato

Ecco la mia prova:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { JpaTestConfig.class }) 

@WebAppConfiguration 
public class HomeControllerTest { 

@Resource 
private WebApplicationContext webApplicationContext; 

private MockMvc mockMvc; 

@Test 
public void testRoot() throws Exception { 
    mockMvc.perform(get("/").accept(MediaType.TEXT_PLAIN)).andDo(print()) 
      // print the request/response in the console 
      .andExpect(status().isOk()).andExpect(content().contentType(MediaType.TEXT_PLAIN)) 
      .andExpect(content().string("Hello World!")); 
} 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 
} 

Ecco il mio pom.xml rilevanti:

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.10</version> 
    <scope>test</scope> 
<exclusions> 
    <exclusion> 
     <artifactId>hamcrest-core</artifactId> 
     <groupId>org.hamcrest</groupId> 
    </exclusion> 
</exclusions> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>3.2.1.RELEASE</version> 
</dependency> 

Ho la seguente classe configurazione di prova:

@Configuration 
@EnableTransactionManagement 
@ComponentScan(basePackages = { "com.myproject.service", "com.myproject.utility", 
     "com.myproject.controller" }) 
@ImportResource("classpath:applicationContext.xml") 
public class JpaTestConfig { 
@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 
... 
} 

// various other services/datasource but not controllers 
} 

E 'la mia comprensione che aggiungendo @WebAppConfiguration forzerà Spring a iniettarlo. Ma quando ho eseguito questo test dall'interno di Eclipse ottengo:

causati da: org.springframework.beans.factory.NoSuchBeanDefinitionException: No fagiolo qualifica di tipo [org.springframework.web.context.WebApplicationContext] trovato per la dipendenza : atteso almeno 1 bean che si qualifica come candidato autoptico per questa dipendenza. annotazioni Dipendenza: {@ org.springframework.beans.factory.annotation.Autowired (richiesto = true)} a org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:967) a org .springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:837) a org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:749) a org.springframework.beans .factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:486)

Aggiornamento - ho dovuto cambiare la mia classe di configurazione di test Java

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "...." }) 
@EnableTransactionManagement 
@ImportResource("classpath:applicationContext.xml") 
public class JpaTestConfig extends WebMvcConfigurationSupport { 

Tuttavia, il problema è ora che posso chiamare il mio servizio REST, ma invoca alcuni altri servizi, tra cui chiamate al database . Qual è il modo preferito per testare la chiamata e una risposta derisoria. Vorrei testare condizioni valide e non valide.

risposta

0

Perché non aggiungere questa annotazione e vedere se funziona. Sostituisci XXXX-text.xml con il tuo xml di mappatura dei bean.

@ContextConfiguration(locations={"classpath:/XXXX-test.xml"}) 
+0

ho i miei fagioli mappati nel @Configuration: – sonoerin

+1

Si scopre avevo bisogno di aggiungere quanto segue alla mia prova classe di configurazione: @EnableWebMvc @ComponentScan (...) JpaTestConfig estende WebMvcConfigurationSupport – sonoerin

+0

buona scoperta. Aggiungi questo aggiornamento alla tua domanda. Oppure prova a rispondere alla tua domanda con piccoli dettagli. –

21

Nel mio caso problema è stato risolto sostituendo:

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { ... }) 

con

@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { ... }) 

Avviso del Web in nome class loader. Con il caricatore precedente, è stato iniettato il GenericApplicationContext nonostante l'annotazione @WebAppConfiguration.

+1

Fantastico !! Sto usando Spring 4.2 e ho cercato così tanto per risolvere questo problema. Aggiunto '@ WebAppConfiguration' anche se non funzionava. Questo ha risolto il mio problema. –

+1

Questa è la risposta corretta. – eis

+0

Questa è esattamente la soluzione giusta per il mio problema! Inoltre, in alternativa, ho rimosso il "loader" da "@ContextConfiguration", in modo che AnnotationConfigContextLoader non collidesse con "@WebAppConfiguration" – dchang

5

L'impostazione di seguito utilizza solo le classi di configurazione Java e funziona correttamente.

@WebAppConfiguration 
@ContextConfiguration(classes = TestApplicationContext.class) 
public class MyClassTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext wac; 

    @Before 
    public void setUp() { 
     mockMvc = webAppContextSetup(wac).build(); 
    } 
    ....  
} 

@Configuration 
public class TestApplicationContext { 

    @Bean 
    public MyBean myBeanId(){ 
     return Mockito.mock(MyBean.class); 
    } 
    .... 
} 

La sola presenza di @WebAppConfiguration su una classe di test assicura che un WebApplicationContext sarà caricato per la prova utilizzando un percorso predefinito alla radice dell'applicazione web. Pertanto è possibile autowire il WebApplicationContext e utilizzarlo per configurare mockMvc.

Si noti che @WebAppConfiguration deve essere utilizzato insieme a @ContextConfiguration all'interno della classe di test.