加载WebApplicationContext

要指示TestContext框架加载WebApplicationContext而不是标准ApplicationContext,您可以使用@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:前缀。

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

本节其余示例显示了加载WebApplicationContext的各种配置选项。以下示例显示了TestContext框架对约定优于配置的支持

约定
  • Java

  • 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或上下文initializers,Spring会尝试使用约定来检测配置的存在(即,与WacTests类相同的包中的WacTests-context.xml或静态嵌套的@Configuration类)。

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

默认资源语义
  • Java

  • 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资源前缀来覆盖这两个注解的默认资源语义

显式资源语义
  • Java

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

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