Java.lang.IllegalArgumentException: un ServletContext est nécessaire pour configurer la gestion de servlet par défaut

j'ai la classe d'essai suivante:

@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...

le problème semble provenir de la classe de configuration de Basetest:

@Configuration
@ComponentScan(basePackages = { "com.bignibou" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = RooRegexFilter.class),
        @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = ControllerAdvice.class) })
public class BaseTestConfiguration {

}

j'obtiens systématiquement cette exception:

Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:54)
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:329)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.CGLIB$defaultServletHandlerMapping(<generated>)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$8bb5c1.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:326)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.defaultServletHandlerMapping(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    ... 43 more

Je ne suis pas sûr de savoir comment contourner cette question. Quelque part Spring est à la recherche D'un ServletContext lorsque j'exécute le test et je reçois l'exception ci-dessus...

54
demandé sur balteo 2014-02-03 01:48:25

4 réponses

l'une de vos classes @Configuration est évidemment annotée de @EnableWebMvc . C'est ainsi que DelegatingWebMvcConfiguration finit dans votre trace de pile, puisqu'il est importé par @EnableWebMvc .

donc bien que vous pensez vous n'avez pas besoin d'un WebApplicationContext (et donc d'un ServletContext ), vous en avez en fait besoin simplement parce que vous chargez un contexte d'application avec @EnableWebMvc .

vous avez deux options:

  • Composez les classes de configuration pour votre test d'intégration de sorte que vous n'incluez pas la configuration liée au web (c.-à-d. la(les) classe (s) @Configuration annotée (s) de @EnableWebMvc ).
  • annoter votre classe de test avec @WebAppConfiguration comme suggéré dans d'autres commentaires ci-dessus.

Cordialement,

Sam (auteur du cadre Spring TestContext)

131
répondu Sam Brannen 2014-02-03 10:31:37

on dirait que tu as disparu

@WebAppConfiguration

de votre classe de test.

Le documentation états

le chemin de la base de ressources est utilisé dans les coulisses pour créer un MockServletContext qui sert de ServletContext pour les WebApplicationContext.

en général, un conteneur à Servlet fournit le ServletContext . Depuis vous êtes dans un environnement de test, vous avez besoin d'un faux. @WebAppConfiguration prévoit cela.

36
répondu Sotirios Delimanolis 2014-02-03 04:27:45

pour que vous instanciez le contexte Servlet, vous devez utiliser l'annotation.

@WebAppConfiguration

annotation au niveau de la classe qui est utilisée pour déclarer que L'ApplicationContext chargé pour un test d'intégration devrait être un WebApplicationContext. La simple présence de @WebAppConfiguration sur une classe de test garantit qu'un context Webapplicationcon sera chargé pour le test, en utilisant la valeur par défaut de "file: src / main / webapp" pour le chemin à la racine du web application (c.-à-d. le chemin de la base de ressources). Le chemin de la base de ressources est utilisé dans les coulisses pour créer un Contextemockservlet qui sert de Contextservlet pour le context Webapplicationdu test.

10
répondu Hrishikesh 2014-02-03 05:19:10

j'ai eu une erreur similaire mais en exécutant l'application normalement plutôt que d'essayer d'exécuter des tests.

il s'avère que si vous utilisez un PermissionEvaluator personnalisé alors vous devez le déclarer dans une classe @Configuration séparée de celle avec votre configuration de sécurité principale de ressort.

Voir: Comment puis-je ajouter une méthode à base de sécurité à un Ressort de Démarrage du projet?

Il ya aussi un ouvert Numéro Github: https://github.com/spring-projects/spring-boot/issues/4875

0
répondu Robert Hunt 2017-05-23 11:33:26