|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
用于测试的元注解支持
您可以将大多数测试相关注解用作 元注解来创建自定义组合 注解,从而减少整个测试套件中的配置重复。
你可以将以下每个注解作为元注解与 TestContext框架配合使用。
-
@BootstrapWith -
@ContextConfiguration -
@ContextHierarchy -
@ActiveProfiles -
@TestPropertySource -
@DirtiesContext -
@WebAppConfiguration -
@TestExecutionListeners -
@Transactional -
@BeforeTransaction -
@AfterTransaction -
@Commit -
@Rollback -
@Sql -
@SqlConfig -
@SqlMergeMode -
@SqlGroup -
@Repeat(仅支持JUnit 4) -
@Timed(仅支持JUnit 4) -
@IfProfileValue(仅支持JUnit 4) -
@ProfileValueSourceConfiguration(仅支持JUnit 4) -
@SpringJUnitConfig(仅JUnit Jupiter支持) -
@SpringJUnitWebConfig(仅JUnit Jupiter支持) -
@TestConstructor(仅JUnit Jupiter支持) -
@NestedTestConfiguration(仅JUnit Jupiter支持) -
@EnabledIf(仅JUnit Jupiter支持) -
@DisabledIf(仅JUnit Jupiter支持)
请考虑以下示例:
-
Java
-
Kotlin
@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class UserRepositoryTests { }
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
如果我们发现基于 JUnit 4 的测试套件中重复使用上述配置,可以通过引入自定义组合注解来减少重复代码,该注解能集中管理 Spring 的通用测试配置,具体示例如下:
-
Java
-
Kotlin
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }
然后,我们可以使用自定义的@TransactionalDevTestConfig注解来简化基于JUnit 4的单个测试类的配置,如下所示:
-
Java
-
Kotlin
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class UserRepositoryTests { }
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class OrderRepositoryTests
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class UserRepositoryTests
如果我们编写的测试使用JUnit Jupiter,还能进一步减少代码重复, 因为JUnit 5中的注解也可作为元注解使用。考虑以下示例:
-
Java
-
Kotlin
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
如果发现我们在基于 JUnit Jupiter 的测试套件中重复使用前述配置,可以通过引入自定义的组合注解来减少重复,该注解集中管理 Spring 和 JUnit Jupiter 的通用测试配置,如下所示:
-
Java
-
Kotlin
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }
然后我们可以使用自定义的@TransactionalDevTestConfig注解来简化基于JUnit Jupiter的单个测试类的配置,如下所示:
-
Java
-
Kotlin
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
由于JUnit Jupiter支持将@Test、@RepeatedTest、ParameterizedTest等作为元注解使用,
您也可以在测试方法级别创建自定义组合注解。例如,如果我们希望创建一个组合注解,
将JUnit Jupiter的@Test和@Tag注解与Spring的@Transactional注解结合,
可以创建@TransactionalIntegrationTest注解,如下所示:
-
Java
-
Kotlin
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
public @interface TransactionalIntegrationTest { }
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
annotation class TransactionalIntegrationTest { }
然后我们可以使用自定义的@TransactionalIntegrationTest注解来简化基于JUnit Jupiter的单个测试方法的配置,如下所示:
-
Java
-
Kotlin
@TransactionalIntegrationTest
void saveOrder() { }
@TransactionalIntegrationTest
void deleteOrder() { }
@TransactionalIntegrationTest
fun saveOrder() { }
@TransactionalIntegrationTest
fun deleteOrder() { }
如需更多详细信息,请参阅 Spring 注解编程模型 wiki 页面。