WebApplicationContext
のロード
TestContext フレームワークに標準の ApplicationContext
ではなく WebApplicationContext
をロードするよう指示するには、それぞれのテストクラスに @WebAppConfiguration
でアノテーションを付けます。
テストクラスに @WebAppConfiguration
が存在すると、TestContext フレームワーク(TCF)に対して、統合テストのために WebApplicationContext
(WAC)をロードする必要があります。バックグラウンドで、TCF は MockServletContext
が作成され、テストの WAC に提供されるようにします。デフォルトでは、MockServletContext
のベースリソースパスは src/main/webapp
に設定されています。これは、JVM のルートに対する相対パス(通常はプロジェクトへのパス)として解釈されます。Maven プロジェクトの Web アプリケーションのディレクトリ構造に精通している場合は、src/main/webapp
が WAR のルートのデフォルトの場所であることを知っています。このデフォルトをオーバーライドする必要がある場合は、@WebAppConfiguration
アノテーションへの代替パス(たとえば、@WebAppConfiguration("src/test/webapp")
)を提供できます。ファイルシステムではなくクラスパスからベースリソースパスを参照する場合は、Spring の classpath:
プレフィックスを使用できます。
WebApplicationContext
実装に対する Spring のテストサポートは、標準 ApplicationContext
実装に対するサポートと同等です。WebApplicationContext
でテストする場合、@ContextConfiguration
を使用して、XML 構成ファイル、Groovy スクリプト、@Configuration
クラスを自由に宣言できます。@ActiveProfiles
、@TestExecutionListeners
、@Sql
、@Rollback
など、他のテストアノテーションも自由に使用できます。
このセクションの残りの例は、WebApplicationContext
をロードするためのさまざまな構成オプションの一部を示しています。次の例は、TestContext フレームワークの設定よりも規約に対するサポートを示しています。
規約
Kotlin
@ExtendWith(SpringExtension.class)
// defaults to "file:src/main/webapp"
@WebAppConfiguration
// detects "WacTests-context.xml" in the same package
// or static nested @Configuration classes
@ContextConfiguration
class WacTests {
//...
}
@ExtendWith(SpringExtension::class)
// defaults to "file:src/main/webapp"
@WebAppConfiguration
// detects "WacTests-context.xml" in the same package
// or static nested @Configuration classes
@ContextConfiguration
class WacTests {
//...
}
リソースベースパスを指定せずに @WebAppConfiguration
でテストクラスにアノテーションを付けると、リソースパスは事実上 file:src/main/webapp
にデフォルト設定されます。同様に、リソース locations
、コンポーネント classes
、コンテキスト initializers
を指定せずに @ContextConfiguration
を宣言すると、Spring は規則(つまり、WacTests
クラスまたは静的ネスト @Configuration
クラスと同じパッケージ内の WacTests-context.xml
)を使用して構成の存在を検出しようとします。
次の例は、@WebAppConfiguration
でリソースベースパスを明示的に宣言し、@ContextConfiguration
で XML リソースの場所を明示的に宣言する方法を示しています。
デフォルトのリソースセマンティクス
Kotlin
@ExtendWith(SpringExtension.class)
// file system resource
@WebAppConfiguration("webapp")
// classpath resource
@ContextConfiguration("/spring/test-servlet-config.xml")
class WacTests {
//...
}
@ExtendWith(SpringExtension::class)
// file system resource
@WebAppConfiguration("webapp")
// classpath resource
@ContextConfiguration("/spring/test-servlet-config.xml")
class WacTests {
//...
}
ここで注意すべき重要なことは、これらの 2 つのアノテーションを持つパスのセマンティクスが異なることです。デフォルトでは、@WebAppConfiguration
リソースパスはファイルシステムベースですが、@ContextConfiguration
リソースロケーションはクラスパスベースです。
次の例は、Spring リソースプレフィックスを指定することで、両方のアノテーションのデフォルトのリソースセマンティクスをオーバーライドできることを示しています。
明示的なリソースセマンティクス
Kotlin
@ExtendWith(SpringExtension.class)
// classpath resource
@WebAppConfiguration("classpath:test-web-resources")
// file system resource
@ContextConfiguration("file:src/main/webapp/WEB-INF/servlet-config.xml")
class WacTests {
//...
}
@ExtendWith(SpringExtension::class)
// classpath resource
@WebAppConfiguration("classpath:test-web-resources")
// file system resource
@ContextConfiguration("file:src/main/webapp/WEB-INF/servlet-config.xml")
class WacTests {
//...
}
この例のコメントを前の例と比較してください。