对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

TestContext 框架支持类

本节介绍支持 Spring TestContext 框架的各种类。spring-doc.cadn.net.cn

春季JUnit 4 Runner

Spring TestContext 框架通过自定义功能与 JUnit 4 实现了全面集成 运行者(支持 JUnit 4.12 或更高版本)。通过对测试类进行注释,记入@RunWith(春JUnit4ClassRunner.class)或者更短的@RunWith(SpringRunner.class)变体中,开发者可以实现基于 JUnit 4 的标准单元测试和集成测试, 同时享受 TestContext 框架的优势,例如支持 加载应用上下文、测试实例的依赖注入、事务测试 方法执行,依此类推。如果你想使用 Spring TestContext 框架,配合 替代运行器(如JUnit 4参数跑者)或第三方跑者 (例如假JUnitRunner你可以选择使用 Spring 对 JUnit 规则的支持spring-doc.cadn.net.cn

以下代码列表展示了配置测试类的最低要求 使用定制Spring跑步者:spring-doc.cadn.net.cn

@RunWith(SpringRunner.class)
@TestExecutionListeners({})
public class SimpleTest {

	@Test
	public void testMethod() {
		// test logic...
	}
}
@RunWith(SpringRunner::class)
@TestExecutionListeners
class SimpleTest {

	@Test
	fun testMethod() {
		// test logic...
	}
}

在上述例子中,@TestExecutionListeners配置为空列表,为 禁用默认监听器,否则需要应用上下文自 通过@ContextConfiguration.spring-doc.cadn.net.cn

春季JUnit 4规则

org.springframework.test.context.junit4.rulespackage 提供以下 JUnit 4条规则(支持JUnit 4.12及更高版本):spring-doc.cadn.net.cn

春季课规则是JUnit测试规则支持 Spring 的类级功能 TestContext框架,而春季法则是JUnit方法规则支持 Spring TestContext 框架的实例级和方法级功能。spring-doc.cadn.net.cn

春季奔跑者,Spring基于规则的JUnit支持具有以下优势 独立于任何org.junit.runner.Runner实现 和 因此可以为 结合现有的替代跑道(如JUnit 4)参数)或 第三方跑者(例如假JUnitRunner).spring-doc.cadn.net.cn

为了支持TestContext框架的完整功能,您必须将春季课规则其中春季法则.以下示例展示了正确的方法 在积分测试中声明这些规则:spring-doc.cadn.net.cn

// Optionally specify a non-Spring Runner via @RunWith(...)
@ContextConfiguration
public class IntegrationTest {

	@ClassRule
	public static final SpringClassRule springClassRule = new SpringClassRule();

	@Rule
	public final SpringMethodRule springMethodRule = new SpringMethodRule();

	@Test
	public void testMethod() {
		// test logic...
	}
}
// Optionally specify a non-Spring Runner via @RunWith(...)
@ContextConfiguration
class IntegrationTest {

	@Rule
	val springMethodRule = SpringMethodRule()

	@Test
	fun testMethod() {
		// test logic...
	}

	companion object {
		@ClassRule
		val springClassRule = SpringClassRule()
	}
}

JUnit 4 支援职业

org.springframework.test.context.junit4包提供以下支持 基于 JUnit 4 的测试用例类(支持 JUnit 4.12 及更高版本):spring-doc.cadn.net.cn

摘要JUnit4SpringContextTesting(摘要)是一个抽象的基测试类,集成了Spring TestContext 框架与显式应用上下文在 A 中进行测试支持 JUnit 4环境。当你伸展时摘要JUnit4SpringContextTesting(摘要),你可以访问一个保护 应用上下文实例变量,你可以用它来执行显式的BEAN 查找或测试上下文整体状态。spring-doc.cadn.net.cn

摘要事务JUnit4春季上下文测试是 的抽象事务扩展摘要JUnit4SpringContextTesting(摘要)这为JDBC增加了一些便利功能 访问。 本类期望javax.sql.数据源豆子和PlatformTransactionManager豆子定义在应用上下文. 当你 扩展摘要事务JUnit4春季上下文测试,你可以访问一个保护 jdbc模板实例变量,你可以用来运行SQL语句来查询 数据库。 你可以利用此类查询确认数据库状态,无论是在运行运行与数据库相关的应用代码之前还是之后,Spring 确保此类查询运行在与应用代码相同的事务范围内。当与ORM 工具一起使用时,务必避免误报。如 JDBC 测试支持中提到的,摘要事务JUnit4春季上下文测试还提供了方便的方法,使得委派给JdbcTestUtils通过使用上述方法jdbc模板. 此外摘要事务JUnit4春季上下文测试提供executeSqlScript(..)运行SQL脚本的方法,针对配置的数据来源.spring-doc.cadn.net.cn

这些类方便于扩展。如果你不希望你的测试类绑定于 Spring 特定的类层级结构,你可以配置你自己的自定义测试类,通过使用@RunWith(SpringRunner.class)或者说Spring的JUnit规则

JUnit Jupiter 的 SpringExtension

Spring TestContext 框架支持与 JUnit Jupiter 测试的全面集成 该框架在JUnit 5中引入。通过对测试类进行注释,记入@ExtendWith(SpringExtension.class)你可以实现标准的JUnit Jupiter单元 以及集成测试,同时享受 TestContext 框架的优势, 例如支持加载应用上下文、测试实例的依赖注入, 事务测试方法执行,等等。spring-doc.cadn.net.cn

此外,得益于 JUnit Jupiter 丰富的扩展 API,Spring 提供了 这些功能超出了 Spring 为 JUnit 4 支持的功能集,以及 测试NG:spring-doc.cadn.net.cn

以下代码列表展示了如何配置测试类以使用春季扩展@ContextConfiguration:spring-doc.cadn.net.cn

// Instructs JUnit Jupiter to extend the test with Spring support.
@ExtendWith(SpringExtension.class)
// Instructs Spring to load an ApplicationContext from TestConfig.class
@ContextConfiguration(classes = TestConfig.class)
class SimpleTests {

	@Test
	void testMethod() {
		// test logic...
	}
}
// Instructs JUnit Jupiter to extend the test with Spring support.
@ExtendWith(SpringExtension::class)
// Instructs Spring to load an ApplicationContext from TestConfig::class
@ContextConfiguration(classes = [TestConfig::class])
class SimpleTests {

	@Test
	fun testMethod() {
		// test logic...
	}
}

由于你也可以在 JUnit 5 中使用注释作为元注释,Spring 提供了@SpringJUnitConfig@SpringJUnitWebConfig为简化 测试配置应用上下文以及朱尼特·朱庇特。spring-doc.cadn.net.cn

以下示例使用@SpringJUnitConfig以减少配置数量 前述示例中使用的例子:spring-doc.cadn.net.cn

// Instructs Spring to register the SpringExtension with JUnit
// Jupiter and load an ApplicationContext from TestConfig.class
@SpringJUnitConfig(TestConfig.class)
class SimpleTests {

	@Test
	void testMethod() {
		// test logic...
	}
}
// Instructs Spring to register the SpringExtension with JUnit
// Jupiter and load an ApplicationContext from TestConfig.class
@SpringJUnitConfig(TestConfig::class)
class SimpleTests {

	@Test
	fun testMethod() {
		// test logic...
	}
}

类似地,以下示例使用@SpringJUnitWebConfig以创建WebApplicationContext用于JUnit Jupiter:spring-doc.cadn.net.cn

// Instructs Spring to register the SpringExtension with JUnit
// Jupiter and load a WebApplicationContext from TestWebConfig.class
@SpringJUnitWebConfig(TestWebConfig.class)
class SimpleWebTests {

	@Test
	void testMethod() {
		// test logic...
	}
}
// Instructs Spring to register the SpringExtension with JUnit
// Jupiter and load a WebApplicationContext from TestWebConfig::class
@SpringJUnitWebConfig(TestWebConfig::class)
class SimpleWebTests {

	@Test
	fun testMethod() {
		// test logic...
	}
}

请参阅相关文档@SpringJUnitConfig@SpringJUnitWebConfig季 朱尼特 朱庇特测试注释以获取更多细节。spring-doc.cadn.net.cn

依赖注入春季扩展

春季扩展实现参数解析器JUnit Jupiter 的扩展 API,允许 Spring 为测试提供依赖注入 构造器、测试方法和测试生命周期回调方法。spring-doc.cadn.net.cn

具体来说,是春季扩展可以从测试中注入依赖关系应用上下文被分解为测试构造器和方法,这些方法被注释为 斯普林斯@BeforeTransaction@AfterTransaction或者说JUnit的@BeforeAll,@AfterAll,@BeforeEach,@AfterEach,@Test,@RepeatedTest,@ParameterizedTest, 以及其他。spring-doc.cadn.net.cn

构造者注入

如果 JUnit Jupiter 测试类构造器中的某个参数类型为应用上下文(或其子类型)或被注释或元注释为@Autowired,@Qualifier@Value,Spring 注入该特定值 参数对应的豆子或测试值应用上下文.spring-doc.cadn.net.cn

Spring 还可以配置为 如果满足条件,自动接线测试类构造器的所有参数 构造器被认为是可自导的。构造子被认为是 如果满足以下条件中的一项(按优先顺序排列),则该自发可作。spring-doc.cadn.net.cn

@TestConstructor关于@TestConstructor以及如何更改全局测试构造器的自动布线模式spring-doc.cadn.net.cn

如果测试类的构造子被认为是可自导的,则使用 承担解析构造子中所有参数参数的责任。 因此,没有其他参数解析器在JUnit注册,木星可以解决 该构造子的参数。

测试类的构造器注入不得与JUnit同时使用 朱庇特的@TestInstance(PER_CLASS)如果@DirtiesContext用于闭合 测试应用上下文测试前后方法。spring-doc.cadn.net.cn

原因是@TestInstance(PER_CLASS)指示朱尼特·朱庇特缓存测试 测试方法调用之间的实例。因此,测试实例将保持 提及最初从一应用上下文该 后来被关闭。因为测试类的构造子只调用 一旦处于此类情形,依赖注入将不再发生,后续测试也将持续进行 会与咖啡豆从闭合处相互作用应用上下文这可能导致错误。spring-doc.cadn.net.cn

使用@DirtiesContext在 中,采用“测试前方法”或“测试后方法”模式 结合@TestInstance(PER_CLASS)必须配置依赖节点 通过现场注射或定位器注入,以便在测试间隙重新注入 方法调用。spring-doc.cadn.net.cn

在下面的例子中,Spring 注入了订单服务豆子来自应用上下文载入自TestConfig.class进入OrderServiceIntegrationTests构造 函数。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class OrderServiceIntegrationTests {

	private final OrderService orderService;

	@Autowired
	OrderServiceIntegrationTests(OrderService orderService) {
		this.orderService = orderService;
	}

	// tests that use the injected OrderService
}
@SpringJUnitConfig(TestConfig::class)
class OrderServiceIntegrationTests @Autowired constructor(private val orderService: OrderService){
	// tests that use the injected OrderService
}

注意,该特性使测试依赖关系为最后因此是不可改变的。spring-doc.cadn.net.cn

如果spring.test.constructor.autowire.mode性质为(参见@TestConstructor),我们可以省略 的声明@Autowired在前述示例中的构造子上,结果如下。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class OrderServiceIntegrationTests {

	private final OrderService orderService;

	OrderServiceIntegrationTests(OrderService orderService) {
		this.orderService = orderService;
	}

	// tests that use the injected OrderService
}
@SpringJUnitConfig(TestConfig::class)
class OrderServiceIntegrationTests(val orderService:OrderService) {
	// tests that use the injected OrderService
}

方法注入

如果JUnit Jupiter测试方法或测试生命周期回调方法中的参数为 类型应用上下文(或其子类型)或被注释或元注释为@Autowired,@Qualifier@Value,Spring 注入该特定值 参数,对应的测试豆应用上下文.spring-doc.cadn.net.cn

在下面的例子中,Spring 注入了订单服务来自应用上下文载入自TestConfig.class进入deleteOrder()测试方法:spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class OrderServiceIntegrationTests {

	@Test
	void deleteOrder(@Autowired OrderService orderService) {
		// use orderService from the test's ApplicationContext
	}
}
@SpringJUnitConfig(TestConfig::class)
class OrderServiceIntegrationTests {

	@Test
	fun deleteOrder(@Autowired orderService: OrderService) {
		// use orderService from the test's ApplicationContext
	}
}

由于参数解析器在JUnit Jupiter中,你也可以 将多个依赖注入到单一方法中,不仅来自 Spring,也包括 来自JUnit Jupiter本身或其他第三方扩展。spring-doc.cadn.net.cn

以下示例展示了如何让 Spring 和 JUnit Jupiter 都将依赖关系注入到placeOrderRepeatedly()同时进行测试方法。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class OrderServiceIntegrationTests {

	@RepeatedTest(10)
	void placeOrderRepeatedly(RepetitionInfo repetitionInfo,
			@Autowired OrderService orderService) {

		// use orderService from the test's ApplicationContext
		// and repetitionInfo from JUnit Jupiter
	}
}
@SpringJUnitConfig(TestConfig::class)
class OrderServiceIntegrationTests {

	@RepeatedTest(10)
	fun placeOrderRepeatedly(repetitionInfo:RepetitionInfo, @Autowired orderService:OrderService) {

		// use orderService from the test's ApplicationContext
		// and repetitionInfo from JUnit Jupiter
	}
}

注意 的使用@RepeatedTest来自JUnit朱庇特,使测试方法能够访问访问重复信息.spring-doc.cadn.net.cn

@Nested测试类配置

Spring TestContext 框架支持在@Nested自 Spring Framework 5.0 以来 JUnit Jupiter 中的测试类;然而,直到Framework 5.3 的类级测试配置注释并未继承自像从超类那样包围类。spring-doc.cadn.net.cn

Spring Framework 5.3引入了第一类支持,用于继承测试类配置,这些配置将由 违约。 要从默认状态更改继承模式转为覆盖模式,你可以注释个人@Nested测试类@NestedTestConfiguration(EnclosingConfiguration.OVERRIDE). 一个明确的@NestedTestConfiguration声明将适用于注释测试类以及其任何子类和嵌套类。因此,你可以注释顶级测试类 跟@NestedTestConfiguration,这适用于其所有嵌套测试类 递 归。spring-doc.cadn.net.cn

为了允许开发团队更改默认覆盖–例如 为了兼容 Spring Framework 5.0 至 5.2 版本——默认模式可以更改通过 JVM 系统属性或spring.properties文件位于classpath 的根节点。详情请参见“更改默认包围配置继承模式”说明。spring-doc.cadn.net.cn

虽然以下“Hello World”示例非常简单,但它展示了如何声明在继承其@Nested测试 类。 在这个具体例子中,只有TestConfig配置类为 继承。 每个嵌套测试类都提供其自身的活动配置文件集,结果为 不同应用上下文对于每个嵌套测试类(详见上下文缓存)。查看支持的注释列表以了解哪些注释可以继承于@Nested考试课程。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class GreetingServiceTests {

	@Nested
	@ActiveProfiles("lang_en")
	class EnglishGreetings {

		@Test
		void hello(@Autowired GreetingService service) {
			assertThat(service.greetWorld()).isEqualTo("Hello World");
		}
	}

	@Nested
	@ActiveProfiles("lang_de")
	class GermanGreetings {

		@Test
		void hello(@Autowired GreetingService service) {
			assertThat(service.greetWorld()).isEqualTo("Hallo Welt");
		}
	}
}
@SpringJUnitConfig(TestConfig::class)
class GreetingServiceTests {

	@Nested
	@ActiveProfiles("lang_en")
	inner class EnglishGreetings {

		@Test
		fun hello(@Autowired service:GreetingService) {
			assertThat(service.greetWorld()).isEqualTo("Hello World")
		}
	}

	@Nested
	@ActiveProfiles("lang_de")
	inner class GermanGreetings {

		@Test
		fun hello(@Autowired service:GreetingService) {
			assertThat(service.greetWorld()).isEqualTo("Hallo Welt")
		}
	}
}

测试NG支持课程

org.springframework.test.context.testng该软件包提供以下支持针对基于 TestNG 的测试用例的类:spring-doc.cadn.net.cn

摘要测试NGSpringContextTests是一个抽象的基测试类,集成了Spring TestContext 框架与显式应用上下文测试支持中的测试NG环境。当你扩展时摘要测试NGSpringContextTests,你可以访问一个保护 应用上下文实例变量,你可以用它来执行显式的BEAN 查找或测试上下文整体状态。spring-doc.cadn.net.cn

摘要事务测试NGSpring上下文测试是 的抽象事务扩展摘要测试NGSpringContextTests这为JDBC增加了一些便利功能 访问。 本类期望javax.sql.数据源豆子和PlatformTransactionManager豆子定义在应用上下文. 当你 扩展摘要事务测试NGSpring上下文测试,你可以访问一个保护 jdbc模板实例变量,你可以用来运行SQL语句来查询 数据库。 你可以利用此类查询确认数据库状态,无论是在运行运行与数据库相关的应用代码之前还是之后,Spring 确保此类查询运行在与应用代码相同的事务范围内。当与ORM 工具一起使用时,务必避免误报。如 JDBC 测试支持中提到的,摘要事务测试NGSpring上下文测试还提供了方便的方法,使得委派给JdbcTestUtils通过使用上述方法jdbc模板. 此外摘要事务测试NGSpring上下文测试提供executeSqlScript(..)运行SQL脚本的方法,针对配置的数据来源.spring-doc.cadn.net.cn

这些类方便于扩展。如果你不希望你的测试类绑定于 Spring 特定的类层级结构,你可以配置你自己的自定义测试类,通过使用@ContextConfiguration,@TestExecutionListeners,依此类推手动用 a 来实现测试类的测验类的测验仪表TestContextManager. 请参见源代码 之摘要测试NGSpringContextTests举个示例,说明如何为测试类进行仪器化。