本节介绍支持 Spring TestContext 框架的各种类。
Spring JUnit 4 运行程序
Spring TestContext 框架通过自定义提供与 JUnit 4 的完全集成
runner(在 JUnit 4.12 或更高版本上受支持)。通过使用或更短的变体注释测试类,开发人员可以实现基于 JUnit 4 的标准单元和集成测试,以及
同时获得 TestContext 框架的好处,例如支持
加载应用程序上下文、测试实例的依赖注入、事务测试
方法执行,依此类推。如果要将 Spring TestContext 框架与
替代运行器(例如 JUnit 4 的运行器)或第三方运行器
(例如 ),您可以选择使用 Spring 对 JUnit 规则的支持。@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
Parameterized
MockitoJUnitRunner
下面的代码清单显示了将测试类配置为
使用自定义 Spring 运行:Runner
-
Java
-
Kotlin
@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
ApplicationContext
@ContextConfiguration
Spring JUnit 4 规则
该软件包提供以下 JUnit
4 条规则(在 JUnit 4.12 或更高版本上支持):org.springframework.test.context.junit4.rules
-
SpringClassRule
-
SpringMethodRule
SpringClassRule
是支持 Spring 类级功能的 JUnit
TestContext 框架,而是一个支持
Spring TestContext 框架的实例级和方法级功能。TestRule
SpringMethodRule
MethodRule
与 相比,Spring 基于规则的 JUnit 支持具有
独立于任何实现,因此可以
与现有的替代运行器(例如 JUnit 4 的)结合使用,或者
第三方运行器(如 .SpringRunner
org.junit.runner.Runner
Parameterized
MockitoJUnitRunner
若要支持 TestContext 框架的完整功能,必须将 与 组合在一起。以下示例显示了正确的方法
要在集成测试中声明这些规则,请执行以下操作:SpringClassRule
SpringMethodRule
-
Java
-
Kotlin
// 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 支持类
该软件包提供以下支持
基于 JUnit 4 的测试用例的类(在 JUnit 4.12 或更高版本上受支持):org.springframework.test.context.junit4
-
AbstractJUnit4SpringContextTests
-
AbstractTransactionalJUnit4SpringContextTests
AbstractJUnit4SpringContextTests
是一个抽象的基测试类,它集成了
Spring TestContext 框架,在
JUnit 4 环境。当您扩展 时,您可以访问可用于执行显式
Bean 查找或测试整个上下文的状态。ApplicationContext
AbstractJUnit4SpringContextTests
protected
applicationContext
AbstractTransactionalJUnit4SpringContextTests
是一个抽象的事务扩展,它为 JDBC 增加了一些便利功能
访问。此类需要在 中定义 Bean 和 Bean。当你
extend ,您可以访问一个实例变量,您可以使用该变量运行 SQL 语句来查询
数据库。您可以使用此类查询来确认之前和之后的数据库状态
运行与数据库相关的应用程序代码,Spring 确保此类查询在
与应用程序代码相同的事务的作用域。与以下人员一起使用时
ORM工具,一定要避免误报。
如JDBC测试支持中所述,还提供了以下便利方法:
委托给方法 in 使用上述 .
此外,还提供了一种针对配置的 .AbstractJUnit4SpringContextTests
javax.sql.DataSource
PlatformTransactionManager
ApplicationContext
AbstractTransactionalJUnit4SpringContextTests
protected
jdbcTemplate
AbstractTransactionalJUnit4SpringContextTests
JdbcTestUtils
jdbcTemplate
AbstractTransactionalJUnit4SpringContextTests
executeSqlScript(..)
DataSource
这些类便于扩展。如果你不想要你的测试类
要绑定到 Spring 特定的类层次结构,您可以配置自己的自定义测试
使用 或 Spring 的 JUnit 规则的类。@RunWith(SpringRunner.class) |
JUnit Jupiter 的 SpringExtension
Spring TestContext 框架提供了与 JUnit Jupiter 测试的完全集成
框架,在 JUnit 5 中引入。通过使用 注释测试类,可以实现基于 JUnit 的标准单元
和集成测试,同时获得 TestContext 框架的好处,
比如支持加载应用上下文、测试实例的依赖注入、
事务测试方法执行等。@ExtendWith(SpringExtension.class)
此外,由于 JUnit Jupiter 中丰富的扩展 API,Spring 提供了 除了 Spring 支持的 JUnit 4 和 测试NG:
-
测试构造函数、测试方法和测试生命周期回调的依赖关系注入 方法。有关更多详细信息,请参阅使用
SpringExtension
的依赖注入。 -
对条件的强大支持 基于 SpEL 表达式、环境变量、系统属性的测试执行、 等等。有关更多详细信息和示例,请参阅 Spring JUnit Jupiter Testing Annotations 中的文档。
@EnabledIf
@DisabledIf
-
自定义组合的注释,结合了 Spring 和 JUnit Jupiter 的注释。看 和 示例中的 Meta-Annotation Support for Testing 了解更多详细信息。
@TransactionalDevTestConfig
@TransactionalIntegrationTest
下面的代码清单显示如何配置测试类以将SpringExtension
@ContextConfiguration
-
Java
-
Kotlin
// 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 提供了 和 组合注解来简化
测试和 JUnit Jupiter 的配置。@SpringJUnitConfig
@SpringJUnitWebConfig
ApplicationContext
以下示例用于减少配置量
在前面的示例中使用:@SpringJUnitConfig
-
Java
-
Kotlin
// 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...
}
}
同样,以下示例用于创建用于 JUnit Jupiter 的示例:@SpringJUnitWebConfig
WebApplicationContext
-
Java
-
Kotlin
// 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...
}
}
有关更多详细信息,请参阅 Spring JUnit Jupiter Testing Annotations 中的文档。@SpringJUnitConfig
@SpringJUnitWebConfig
依赖注入SpringExtension
它实现了来自 JUnit Jupiter 的 ParameterResolver
扩展 API,它允许 Spring 为测试提供依赖注入
构造函数、测试方法和测试生命周期回调方法。SpringExtension
具体来说,可以将测试中的依赖项注入到测试构造函数和方法中,这些构造函数和方法带有注释
Spring 的和/或 JUnit 的 , , , , ,
和其他人。SpringExtension
ApplicationContext
@BeforeTransaction
@AfterTransaction
@BeforeAll
@AfterAll
@BeforeEach
@AfterEach
@Test
@RepeatedTest
@ParameterizedTest
构造函数注入
如果 JUnit Jupiter 测试类的构造函数中的特定参数是类型(或其子类型)或用 、 或 进行注释或元注释的,则 Spring 会注入该特定参数的值
参数,并替换为测试的 .ApplicationContext
@Autowired
@Qualifier
@Value
ApplicationContext
如果出现以下情况,还可以将 Spring 配置为自动连接测试类构造函数的所有参数 构造函数被认为是可自动编写的。构造函数被视为 如果满足以下条件之一(按优先顺序),则可自动执行。
-
构造函数用 .
@Autowired
-
@TestConstructor
在属性设置为 的测试类上存在或元存在。autowireMode
ALL
-
默认测试构造函数 autowire 模式已更改为 。
ALL
有关全局测试构造函数 autowire 模式的使用和更改方法的详细信息,请参阅@TestConstructor
。@TestConstructor
如果测试类的构造函数被认为是可自动编写的,则 Spring
负责解析构造函数中所有参数的参数。
因此,没有其他在 JUnit Jupiter 注册的
此类构造函数的参数。ParameterResolver |
测试类的构造函数注入不得与 JUnit 结合使用
木星的支撑 if 用于关闭
测试之前或之后的测试方法。 原因是指示 JUnit Jupiter 缓存测试
测试方法调用之间的实例。因此,测试实例将保留
引用最初从具有
随后被关闭。由于测试类的构造函数只会被调用
一旦进入此类场景,将不会再次发生依赖注入,后续测试
将与关闭的 Bean 交互,这可能会导致错误。 与“测试前方法”或“测试后方法”模式一起使用
与 结合 ,必须从 Spring 配置依赖项
通过现场或定位器进样提供,以便可以在测试之间重新进样
方法调用。 |
在下面的示例中,Spring 将 bean 从加载的 from 注入到构造函数中。OrderService
ApplicationContext
TestConfig.class
OrderServiceIntegrationTests
-
Java
-
Kotlin
@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
}
请注意,此功能允许测试依赖项是不可变的。final
如果属性是 to(参见 @TestConstructor
),我们可以省略上一个示例中构造函数上的声明,从而产生以下结果。spring.test.constructor.autowire.mode
all
@Autowired
-
Java
-
Kotlin
@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 测试方法或测试生命周期回调方法中的参数为
类型(或其子类型)或用 、 或 进行注释或元注释,Spring 注入该特定值
参数与来自测试的 .ApplicationContext
@Autowired
@Qualifier
@Value
ApplicationContext
在下面的例子中,Spring 将 from the loaded from 注入到测试方法中:OrderService
ApplicationContext
TestConfig.class
deleteOrder()
-
Java
-
Kotlin
@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 本身或其他第三方扩展。ParameterResolver
以下示例演示如何让 Spring 和 JUnit Jupiter 注入依赖项
同时进入测试方法。placeOrderRepeatedly()
-
Java
-
Kotlin
@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
}
}
请注意,使用 from JUnit Jupiter 可以让测试方法获得访问权限
更改为 .@RepeatedTest
RepetitionInfo
@Nested
测试类配置
从 Spring Framework 5.0 开始,Spring TestContext 框架就支持在 JUnit Jupiter 的测试类上使用与测试相关的注解;然而,直到春天
框架 5.3 类级测试配置注释未继承自
将类封闭起来,就像它们来自超类一样。@Nested
Spring Framework 5.3 引入了对继承测试类的一流支持
从封闭类中配置,并且此类配置将由
违约。要从默认模式更改为模式,您可以注释
具有 .显式声明将应用于带注释的测试类以及
它的任何子类和嵌套类。因此,您可以注释顶级测试类
with ,这将适用于其所有嵌套测试类
递 归。INHERIT
OVERRIDE
@Nested
@NestedTestConfiguration(EnclosingConfiguration.OVERRIDE)
@NestedTestConfiguration
@NestedTestConfiguration
为了允许开发团队将默认值更改为 – 例如,
为了与 Spring Framework 5.0 到 5.2 兼容 – 可以更改默认模式
全局通过 JVM 系统属性或根目录中的文件
类路径。有关详细信息,请参阅“更改默认封闭配置继承模式”说明。OVERRIDE
spring.properties
尽管下面的“Hello World”示例非常简单,但它演示了如何声明
由其 test 继承的顶级类的通用配置
类。在此特定示例中,只有配置类是
继承。每个嵌套测试类都提供自己的一组活动配置文件,从而生成
每个嵌套测试类都不同(有关详细信息,请参阅上下文缓存)。请参阅支持的注释列表以查看
哪些注释可以在测试类中继承。@Nested
TestConfig
ApplicationContext
@Nested
-
Java
-
Kotlin
@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")
}
}
}
TestNG支持课程
该软件包提供以下支持
基于 TestNG 的测试用例的类:org.springframework.test.context.testng
-
AbstractTestNGSpringContextTests
-
AbstractTransactionalTestNGSpringContextTests
AbstractTestNGSpringContextTests
是一个抽象的基测试类,它集成了
Spring TestContext 框架,在
TestNG 环境。当您扩展 时,您可以访问可用于执行显式
Bean 查找或测试整个上下文的状态。ApplicationContext
AbstractTestNGSpringContextTests
protected
applicationContext
AbstractTransactionalTestNGSpringContextTests
是一个抽象的事务扩展,它为 JDBC 增加了一些便利功能
访问。此类需要在 中定义 Bean 和 Bean。当你
extend ,您可以访问一个实例变量,您可以使用该变量运行 SQL 语句来查询
数据库。您可以使用此类查询来确认之前和之后的数据库状态
运行与数据库相关的应用程序代码,Spring 确保此类查询在
与应用程序代码相同的事务的作用域。与以下人员一起使用时
ORM工具,一定要避免误报。
如JDBC测试支持中所述,还提供了以下便利方法:
委托给方法 in 使用上述 .
此外,还提供了一种针对配置的 .AbstractTestNGSpringContextTests
javax.sql.DataSource
PlatformTransactionManager
ApplicationContext
AbstractTransactionalTestNGSpringContextTests
protected
jdbcTemplate
AbstractTransactionalTestNGSpringContextTests
JdbcTestUtils
jdbcTemplate
AbstractTransactionalTestNGSpringContextTests
executeSqlScript(..)
DataSource
这些类便于扩展。如果你不想要你的测试类
要绑定到 Spring 特定的类层次结构,您可以配置自己的自定义测试
类通过使用 、 等 和 by
使用 .查看源代码
的示例,了解如何检测测试类。@ContextConfiguration @TestExecutionListeners TestContextManager AbstractTestNGSpringContextTests |