中繼註解對測試的支援
您可以將大多數與測試相關的註解作為中繼註解,以建立自訂的複合註解,並減少測試套件中組態的重複。
您可以將以下每個註解與 TestContext framework 結合使用作為中繼註解。
-
@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
、@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 頁面。