测试的元注释支持
你可以将大多数与测试相关的注解作为元注解来使用,从而创建自定义的复合注解,并减少整个测试套件中的配置重复。
例如,你可以将以下每一项与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)
考虑以下使用SpringExtension与JUnit Jupiter的测试类:
- Java
- Kotlin
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {AppConfig.class, TestDataAccessConfig.class})
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {AppConfig.class, TestDataAccessConfig.class})
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration(classes = [AppConfig::class, TestDataAccessConfig::class])
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration(classes = [AppConfig::class, TestDataAccessConfig::class])
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
如果我们发现我们在整个测试套件中重复使用之前的配置,那么可以通过引入一个自定义的复合注释来减少这种重复,该注释可以集中管理Spring和JUnit Jupiter的通用测试配置,具体如下:
- Java
- Kotlin
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {AppConfig.class, TestDataAccessConfig.class})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ExtendWith(SpringExtension::class)
@ContextConfiguration(classes = [AppConfig::class, TestDataAccessConfig::class])
@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注解编程模型维基页面。