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 { 
    ... 
} 

Klagt über:Wie führen Sie Tests mit einem benutzerdefinierten WebApplicationInitializer aus?

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

UPDATE: @M. Deinum weist darauf hin, dass hier nur ApplicationContextInitializer erlaubt sind - der Fehler ist also ein schlecht gemeldeter Typ mistmatch.

Also ... wie kann ich meinen eigenen MyWebAppInitializer verwenden, um die darin definierte Funktionalität zu testen und zu testen?

+0

Sie können 'ApplicationContextInitializer's' 'WebApplicationInitializer' 'zur Verfügung stellen. Siehe http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html#initializers-- –

+0

Ganz richtig (obwohl ich an Scalas Fehlerberichterstattung verzweifelt, mein geliefertes Wert _ist_ eine Konstante, aber der Fehler ist ein Typkonflikt. So, wie man meinen Test mit einem kundenspezifischen WebApplicationInitializer startet - Frühling bietet die Fähigkeit, sein onStartup (und Leute tun häufig) anzupassen. Gibt es eine Möglichkeit, diese Anpassung in Komponententests zu testen? – user48956

+0

Haben Sie die Frage aktualisiert, um das verbleibende Problem wiederzugeben - wie Sie einen WebApplicationInitializer testen. – user48956

Antwort

8

In Ihrer Kontextkonfiguration sehe ich nicht, dass Sie einen Kontextlader aufgelistet haben. Die AnnotationConfigWebContextLoader wird Instanzen von WebApplicationInitializer auf Ihrem Klassenpfad finden, indem Sie dies hinzufügen und entfernen die Intializer (die, wie Sie bemerkt haben, sind für ApplicationContextInitializers und nicht WebApplicationInitializers) dann sollten Sie alle festgelegt werden.

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

Hier ist ein funktionierendes Beispiel

@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

Die Antwort ist "Sorry, Sie können nicht". Sie könnten auf diese verweisen: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

So wie Sam Brannen sagte:

Obwohl Frühling Mocks für die Servlet-API liefert, Frühling wird keine Servlet-Container verspotten und hat derzeit nicht die Absicht, zu. Spring hat sich immer auf Container-Integrationstests konzentriert. Vollständig Mocking einen Container ist daher außerhalb des Rahmens der Frühjahrstest Unterstützung. Bitte beachten Sie die Kommentare von Rossen und mir oben für weitere Details.

Verwandte Themen