测试的元注解支持
您可以使用大多数测试相关注解作为 元注解 来创建自定义组合注解,并减少整个测试套件中的配置重复。
您可以将以下每一个用作与 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 上受支持) -
@JUnitConfig(仅在 JUnit Jupiter 上受支持) -
@JUnitWebConfig(仅在 JUnit Jupiter 上受支持) -
@TestConstructor(仅在 JUnit Jupiter 上受支持) -
@NestedTestConfiguration(仅在 JUnit Jupiter 上受支持) -
@EnabledIf(仅在 JUnit Jupiter 上受支持) -
@DisabledIf(仅在 JUnit Jupiter 上受支持)
考虑以下示例:
-
Java
@RunWith(InfraRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class OrderRepositoryTests { }
@RunWith(InfraRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class UserRepositoryTests { }
如果我们发现我们在基于 JUnit 4 的测试套件中重复上述配置,我们可以通过引入自定义组合注解来减少重复,该注解集中了 Infra 的通用测试配置,如下所示:
-
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
然后我们可以使用我们的自定义 @TransactionalDevTestConfig 注解来简化基于 JUnit 4 的单个测试类的配置,如下所示:
-
Java
@RunWith(InfraRunner.class)
@TransactionalDevTestConfig
public class OrderRepositoryTests { }
@RunWith(InfraRunner.class)
@TransactionalDevTestConfig
public class UserRepositoryTests { }
如果我们编写使用 JUnit Jupiter 的测试,我们可以进一步减少代码重复,因为 JUnit 5 中的注解也可以用作元注解。 考虑以下示例:
-
Java
@ExtendWith(InfraExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(InfraExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
如果我们发现我们在基于 JUnit Jupiter 的测试套件中重复上述配置,我们可以通过引入自定义组合注解来减少重复,该注解集中了 Infra 和 JUnit Jupiter 的通用测试配置,如下所示:
-
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(InfraExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
然后我们可以使用我们的自定义 @TransactionalDevTestConfig 注解来简化基于 JUnit Jupiter 的单个测试类的配置,如下所示:
-
Java
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
由于 JUnit Jupiter 支持使用 @Test、@RepeatedTest、ParameterizedTest 等作为元注解,您也可以在测试方法级别创建自定义组合注解。
例如,如果我们希望创建一个组合注解,将 JUnit Jupiter 的 @Test 和 @Tag 注解与 Infra 的 @Transactional 注解结合起来,我们可以创建一个 @TransactionalIntegrationTest 注解,如下所示:
-
Java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
public @interface TransactionalIntegrationTest { }
然后我们可以使用我们的自定义 @TransactionalIntegrationTest 注解来简化基于 JUnit Jupiter 的单个测试方法的配置,如下所示:
-
Java
@TransactionalIntegrationTest
void saveOrder() { }
@TransactionalIntegrationTest
void deleteOrder() { }
For further details, see the Infra Annotation Programming Model wiki page.