|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
测试中的元注释支持
你可以用大多数测试相关的注释作为元注释来创建自定义的 注释并减少测试套件间的配置重复。
你可以将以下每项作为元注释,配合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注释以简化
基于 Jupiter 的单个测试类配置如下:
-
Java
-
Kotlin
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
由于朱尼特,朱庇特支持使用@Test,@RepeatedTest,参数化测试,
以及其他作为元注释的注释,你也可以在
测试方法层级。例如,如果我们想创建一个组合的组合注释
这@Test和@Tag来自JUnit Jupiter的注释,其中@Transactional从Spring中获得注释,我们可以创建一个@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 Annotation Programming Model 维基页面。