2014-06-12 14 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 { 
    ... 
} 

Skarży o:Jak uruchomić testy za pomocą niestandardowego programu WebApplicationInitializer?

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

UPDATE: @M. Deinum wskazuje, że dozwolone są tutaj tylko ApplicationContextInitializers - tak więc błąd jest źle zarejestrowanym typem mistmatch.

Więc ... jak mogę użyć mojego MyWebAppInitializer w celu i przetestować zdefiniowaną w nim funkcjonalność?

+0

Możesz podać 'ApplicationContextInitializer's NOT' WebApplicationInitializer's. Zobacz http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html#initializers-- –

+0

Całkiem dobrze (chociaż rozpaczam w raportowaniu błędów Scala, mój dostarczony wartość _jest_ stała, ale błąd jest niedopasowaniem typu). Tak więc, jak rozpocząć test z niestandardowym WebApplicationInitializer - Spring zapewnia możliwość dostosowania jego onStartup (i ludzie często to robią). Czy istnieje sposób na przetestowanie tego dostosowania w testach jednostkowych? – user48956

+0

Zaktualizowałem pytanie, aby odzwierciedlić pozostały problem - jak przetestować WebApplicationInitializer. – user48956

Odpowiedz

8

W konfiguracji kontekstowej nie widzę, aby na liście znajdował się moduł ładujący kontekst. AnnotationConfigWebContextLoader zlokalizuje instancje WebApplicationInitializer na ścieżce klas, dodając to i usuwając intializatory (które, jak już zauważyłeś, są przeznaczone dla ApplicationContextInitializers, a nie WebApplicationInitializers), powinieneś ustawić wszystko.

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

Oto przykład roboczych

@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

Odpowiedź brzmi: "Niestety, nie można". Można odwołać się do tego: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

Podobnie jak Sam Brannen powiedział:

Chociaż Wiosna daje mocks dla Servlet API, Wiosna ma nie drwić pojemnik Servlet i obecnie nie ma zamiaru. Wiosna zawsze koncentrowała się na testach integracji kontenerów. Pełne szyderstwo pojemnika jest zatem poza zakresem testów Spring . Proszę zobaczyć komentarze od Rossen i mnie powyżej, aby uzyskać dalsze szczegóły: .

Powiązane problemy