J'ai la classe de test 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 BaseTestConfiguration:
@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 {
}
Je reçois 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$22(<generated>)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.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 sais pas trop comment résoudre ce problème. Quelque part Spring cherche un ServletContext quand je lance le test et que je reçois l'exception ci-dessus ...
Une de vos classes @Configuration
est évidemment annotée avec @EnableWebMvc
. C'est ainsi que DelegatingWebMvcConfiguration
finit dans votre trace de pile, puisqu'il est importé par @EnableWebMvc
.
Donc bien que vous pensez que vous n’ayez pas besoin de WebApplicationContext
(et donc de ServletContext
), vous en avez réellement besoin simplement parce que vous chargez un contexte d’application avec @EnableWebMvc
.
Vous avez deux options:
@Configuration
annotées avec @EnableWebMvc
).@WebAppConfiguration
comme suggéré dans les autres commentaires ci-dessus.Cordialement,
Sam (auteur du Spring TestContext Framework)
Il semble que tu manques
@WebAppConfiguration
de votre classe de test.
La documentation États
Le chemin de la base de ressources est utilisé en arrière-plan pour créer un fichier MockServletContext qui sert de ServletContext pour le test WebApplicationContext.
Généralement, un conteneur de servlet fournit la variable ServletContext
. Puisque vous êtes dans un environnement de test, vous avez besoin d’un faux. @WebAppConfiguration
fournit cela.
Pour pouvoir instancier le contexte Servlet, vous devez utiliser l'annotation.
@WebAppConfiguration
Une annotation de niveau classe utilisée pour déclarer que le champ ApplicationContext chargé pour un test d'intégration doit être un WebApplicationContext. La simple présence de @WebAppConfiguration sur une classe de test garantit qu'un WebApplicationContext sera chargé pour le test, en utilisant la valeur par défaut de "fichier: src/main/webapp" pour le chemin d'accès à la racine de l'application Web chemin de base). Le chemin de base des ressources est utilisé en arrière-plan pour créer un MockServletContext qui sert de ServletContext pour le test WebApplicationContext.
J'obtenais une erreur similaire, mais tout 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é, vous devez le déclarer dans une classe @Configuration
distincte de celle avec votre configuration de sécurité Spring principale dans.
Voir: Comment ajouter une sécurité basée sur une méthode à un projet Spring Boot?
Il y a aussi un numéro ouvert de Github: https://github.com/spring-projects/spring-boot/issues/4875