测试元注解支持

您可以将大多数与测试相关的注解用作元注解,以创建自定义组合注解,并在测试套件中减少配置重复。

您可以将以下每个注解与TestContext框架一起用作元注解。

  • @BootstrapWith

  • @ContextConfiguration

  • @ContextHierarchy

  • @ContextCustomizerFactories

  • @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@RepeatedTestParameterizedTest等作为元注解,因此您也可以在测试方法级别创建自定义组合注解。例如,如果我们希望创建一个组合注解,将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注解编程模型维基页面。