測試的元註解支援
您可以將大多數測試相關的註解用作元註解,以建立自定義組合註解並減少測試套件中的配置重複。
您可以將以下每個註解與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 Jupiter 中的註解也可以用作元註解。請考慮以下示例:
-
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 頁面。