Loading a WebApplicationContext

为集成测试加载 WebApplicationContext 时,使用 @WebAppConfiguration 注解测试类。此注解指示 TestContext 框架使用 MockServletContext,该 MockServletContext 可以模仿应用程序的 Web 环境。默认情况下,@WebAppConfiguration 基础资源路径设置为 src/main/webapp,但可以通过该注解覆盖此设置。Spring 对 WebApplicationContext 测试的支持包括对 XML 配置文件、Groovy 脚本和 @Configuration 类的支持,以及对其他测试注解的自由使用。

为指示 TestContext framework 加载 WebApplicationContext 而不是标准的 ApplicationContext,你可以用 @WebAppConfiguration 为各自的测试类加注解。

测试类中的 @WebAppConfiguration 表示 TestContext Framework (TCF) 应该为你的集成测试加载一个 WebApplicationContext (WAC)。在后台,TCF 会确保一个 MockServletContext 已创建,并已提供给测试的 WAC。默认情况下,MockServletContext 的基础资源路径设置为 src/main/webapp。这是一个相对于你的 JVM 根路径的路径(正常情况下是你的项目路径)。如果你熟悉 Maven 项目中 Web 应用程序的目录结构,你就会知道`src/main/webapp` 是用于 WAR 根默认位置的。如果你需要覆盖此默认设置,你可以为 @WebAppConfiguration 注解提供一个替换路径(例如,@WebAppConfiguration("src/test/webapp"))。如果你希望从类路径而不是文件系统引用一个基础资源路径,你可以使用 Spring 的 classpath: 前缀。

请注意,Spring 对 WebApplicationContext 实现的测试支持与它对标准 ApplicationContext 实现的支持相当。使用 WebApplicationContext 执行测试时,你可以使用 @ContextConfiguration 来自由地声明 XML 配置文件、Groovy 脚本或 @Configuration 类。你还可以自由地使用任何其他测试注解,如 @ActiveProfiles@TestExecutionListeners@Sql@Rollback 和其他注解。

此部分中的其余示例展现了加载 WebApplicationContext 的一些不同配置选项。以下示例展示了 TestContext framework 对于配置惯例的支持:

  • Conventions

  • 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。类似地,如果你声明 @ContextConfiguration 而不指定资源 locations、组件 classes 或 context initializers,Spring 会尝试使用惯例检测到你的配置存在(即,与 WacTests 类在同一个包之中的 WacTests-context.xml 或嵌套的静态 @Configuration 类)。

以下示例演示了如何使用 @WebAppConfiguration 显式声明资源基路径,并使用 @ContextConfiguration 声明 XML 资源位置:

  • Default resource semantics

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

此处需注意的是,这两者路径语义差异。默认情况下,@WebAppConfiguration 资源路径基于文件系统,而 @ContextConfiguration 资源位置基于类路径。

以下示例演示了我们可以通过指定 Spring 资源前缀来覆盖两者的默认资源语义:

  • Explicit resource semantics

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

对比此示例中的注释与前一个示例。