次のテストクラスがあります。
@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...
この問題は、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 {
}
私は体系的にこの例外を取得します:
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
この問題を回避する方法がわかりません。どういうわけか、Springはテストを実行するときにServletContextを探していますが、上記の例外が発生します...
@Configuration
クラスの1つには、明らかに@EnableWebMvc
の注釈が付けられています。 DelegatingWebMvcConfiguration
は、@EnableWebMvc
によってimportedされるため、スタックトレースで終了する方法です。
したがって、thinkとはいえ、WebApplicationContext
(したがってServletContext
)は必要ありませんが、実際には@EnableWebMvc
を使用してアプリケーションコンテキストをロードしているために必要です。
次の2つのオプションがあります。
@Configuration
アノテーションが付けられた@EnableWebMvc
クラス)が含まれないように、統合テストの構成クラスを作成します。@WebAppConfiguration
の注釈を付けます。よろしく、
サム(Spring TestContext Frameworkの著者)
あなたが行方不明のようです
@WebAppConfiguration
テストクラスから。
ドキュメント 状態
リソースのベースパスはバックグラウンドで使用され、テストのWebApplicationContextのServletContextとして機能するMockServletContextを作成します。
通常、サーブレットコンテナはServletContext
を提供します。テスト環境にいるため、偽物が必要です。 @WebAppConfiguration
はそれを提供します。
サーブレットコンテキストをインスタンス化するには、アノテーションを使用する必要があります。
@WebAppConfiguration
統合テスト用にロードされたApplicationContextがWebApplicationContextであることを宣言するために使用されるクラスレベルの注釈。テストクラスに@WebAppConfigurationが存在するだけで、Webアプリケーションのルート(つまり、リソース)のパスに「file:src/main/webapp」のデフォルト値を使用して、テスト用にWebApplicationContextがロードされます。基本パス)。リソースのベースパスはバックグラウンドで使用され、テストのWebApplicationContextのServletContextとして機能するMockServletContextを作成します。
同様のエラーが発生していましたが、テストを実行しようとするのではなく、アプリケーションを正常に実行していました。
カスタムPermissionEvaluator
を使用している場合は、メインのSpringセキュリティ構成を持つクラスとは別の@Configuration
クラスで宣言する必要があります。
参照: Spring Bootプロジェクトにメソッドベースのセキュリティを追加する方法
Githubの未解決の問題もあります: https://github.com/spring-projects/spring-boot/issues/4875