2014-06-12 6 views
9
class MyWebAppInitializer extends WebApplicationInitializer { 
    def onStartup(servletContext: ServletContext): Unit = { 
     ... 
    } 
} 

@RunWith(classOf[SpringJUnit4ClassRunner]) 
@WebAppConfiguration 
@ContextConfiguration(classes = Array(classOf[MyConfig]), 
    initializers=Array(classOf[MyWebAppInitializer]))  // <<< ERROR 
class MyTest { 
    ... 
} 

si lamenta:Come eseguire i test utilizzando un oggetto WebApplicationInitializer personalizzato?

annotation argument needs to be a constant; found: classOf[MyWebAppInitializer] 

UPDATE: @M. Deinum indica che solo gli ApplicationContextInitializer sono consentiti qui - quindi l'errore è un tipo non corrispondente riportato male.

Quindi ... come posso utilizzare il mio MyWebAppInitializer in ordine e testare la funzionalità in esso definita?

+0

È possibile fornire 'ApplicationContextInitializer's NOT WebApplicationInitializer's. Vedi http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html#initializers-- –

+0

Giusto (anche se mi dispero per la segnalazione degli errori di Scala, il mio fornito value _is_ una costante, ma l'errore è una mancata corrispondenza di tipo). Quindi, come avviare il test con un oggetto WebApplicationInitializer personalizzato: Spring offre la possibilità di personalizzare il proprio onStartup (e le persone lo fanno spesso). C'è un modo per testare questa personalizzazione nei test unitari? – user48956

+0

Hai aggiornato la domanda per riflettere il problema rimanente: come testare un oggetto WebApplicationInitializer. – user48956

risposta

8

Nella configurazione del contesto non vedo che sia elencato un caricatore di contesto. Il AnnotationConfigWebContextLoader localizzerà istanze di WebApplicationInitializer sul classpath, aggiungendo questo e rimuovendo gli intializzatori (che, come si è notato, sono per ApplicationContextInitializers e non WebApplicationInitializers), quindi si dovrebbe essere tutti impostati.

@RunWith(classOf[SpringJUnit4ClassRunner]) 
@WebAppConfiguration 
@ContextConfiguration(classes = {ConfigClass.class, AnotherConfigClass.class}, loader=AnnotationConfigWebContextLoader.class)) 
class MyTest { 
... 

Ecco un esempio di lavoro

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes={WebConfiguration.class, SecurityConfig.class}, loader=AnnotationConfigWebContextLoader.class) 
@ActiveProfiles("dev") 
public class AppTests { 
    private MockMvc mockMvc; 

    @Autowired 
    protected WebApplicationContext webApplicationContext; 

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

    @Test 
    public void simple() throws Exception { 
     mockMvc.perform(MockMvcRequestBuilders.get("/")) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
       .andExpect(MockMvcResultMatchers.view().name("index")); 
    } 
} 
1

La risposta è "Mi dispiace, non è possibile". Si potrebbe fare riferimento a questo: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

proprio come ha detto Sam Brannen:

Anche se la primavera non fornisce schernisce per l'API Servlet, Primavera non non prendere in giro un contenitore Servlet e attualmente non ha intenzione di. La primavera si è sempre concentrata su test di integrazione del contenitore. Completamente il mocking di un container è quindi oltre lo scopo del test di Spring supporto. Si prega di vedere i commenti da Rossen e me sopra per ulteriori dettagli .