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 {
	//...
}

この例のコメントを前の例と比較してください。