閱讀580 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring 5官方文檔》11集成測試 (三)

11.4.2 標準注解支持

以下注解為Spring TestContext 框架所有的配置提供標準語義支持。注意這些注解不僅限於測試,可以用在Spring框架的任意地方。

  • @Autowired
  • @Qualifier
  • @Resource(javax.annotation)如果JSR-250存在
  • @ManagedBean(javax.annotation)如果JSR-250存在
  • @Inject(javax.inject)如果JSR-330存在
  • @Named(javax.inject)如果JSR-330存在
  • @PersistenceContext(javax.persistence)如果JPA存在
  • @PersistenceUnit(javax.persistence)如果JPA存在
  • @Required
  • @Transactional
[Note]
在Spring TestContext 框架中,@PostConstruct 和 @PreDestroy 可以通過標準語義在配置於應用程序上下文的任意應用程序組件中使用; 但是, 這些生命周期注解在實際測試類中隻有很有限的作用。如果一個測試類的方法被注解為@PostConstruct,這個方法將在test框架中的任何before方法(也就是被JUnit中的@Before注解方法)調用之前被執行, 這個規則將被應用於測試類的每個方法。另一方麵,如果一個測試類的方法被注解為 @PreDestroy,這個方法將永遠不會被執行。因為建議在測試類中使用test 框架的測試生命周期回調來代替使用@PostConstruct and @PreDestroy。

11.4.3 Spring JUnit 4 測試注解

@IfProfileValue指明該測試隻在特定的測試環境中被啟用。如果ProfileValueSource配置的name屬性與此注解配置的name屬性一致,這該測試將被啟用。否則,該測試將被禁用並忽略。

@IfProfileValue可以用在類級別、方法級別或者兩個同時。使用類級別的@IfProfileValue注解優先於當前類或其子類的任意方法的使用方法級別的注解。有@IfProfileValue注解意味著則測試被隱式開啟。這與JUnit4的@Ignore注解是相類似的,除了使用@Ignore注解是用於禁用測試的之外。

1 @IfProfileValue(name="java.vendor", value="Oracle Corporation")
2 @Test
3 public void testProcessWhichRunsOnlyOnOracleJvm() {
4 // some logic that should run only on Java VMs from Oracle Corporation
5 }

或者,你可以 配置@IfProfileValue使用values列表(或語義)來實現JUnit 4環境中的類似TestNG對測試組的支持。

1 @IfProfileValue(name="test-groups", values={"unit-tests""integration-tests"})
2 @Test
3 public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
4 // some logic that should run only for unit and integration test groups
5 }

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration是類級別注解,用於當獲取通過@IfProfileValue配置的profile值時指定使用什麼樣的ProfileValueSource類型。如果一個測試沒有指定@ProfileValueSourceConfiguration,那麼默認使用SystemProfileValueSource。

1 @ProfileValueSourceConfiguration(CustomProfileValueSource.class)
2 public class CustomProfileValueSourceTests {
3 // class body...
4 }

@Timed

@Timed用於指明被注解的測試必須在指定的時限(毫秒)內結束。如果測試超過指定時限,就當作測試失敗。

時限包括測試方法本身所耗費的時間,包括任何重複(請查看@Repeat)及任意初始化和銷毀所用的時間。

1 @Timed(millis=1000)
2 public void testProcessWithOneSecondTimeout() {
3  // some logic that should not take longer than 1 second to execute
4 }

Spring的@Timed注解與JUnit 4的@Test(timeout=…​)支持相比具有不同的語義。確切地說,由於在JUnit 4中處理方法執行超時的方式(也就是,在獨立純程中執行該測試方法),如果一個測試方法執行時間太長,@Test(timeout=…​)將直接判定該測試失敗。而Spring的@Timed則不直接判定失敗而是等待測試完成。

@Repeat

@Repeat指明該測試方法需被重複執行。注解指定該測試方法被重複的次數。重複的範圍包括該測試方法自身也包括相應的初始化和銷毀方法。

1 @Repeat(10)
2 @Test
3 public void testProcessRepeatedly() {
4  // ...
5 }

11.4.4 Meta-Annotation Support for Testing

可以將大部分測試相關的注解當作 meta-annotations使用,以創建自定義組合注解來減少測試集中的重複配置。

下麵的每個都可以在TestContext框架中被當作meta-annotations使用。

  • @BootstrapWith
  • @ContextConfiguration
  • @ContextHierarchy
  • @ActiveProfiles
  • @TestPropertySource
  • @DirtiesContext
  • @WebAppConfiguration
  • @TestExecutionListeners
  • @Transactional
  • @BeforeTransaction
  • @AfterTransaction
  • @Commit
  • @Rollback
  • @Sql
  • @SqlConfig
  • @SqlGroup
  • @Repeat
  • @Timed
  • @IfProfileValue
  • @ProfileValueSourceConfiguration

例如,如果發現我們在基於JUnit 4的測試集中重複以下配置…

01 @RunWith(SpringRunner.class)
02 @ContextConfiguration({"/app-config.xml""/test-data-access-config.xml"})
03 @ActiveProfiles("dev")
04 @Transactional
05 public class OrderRepositoryTests { }
06  
07 @RunWith(SpringRunner.class)
08 @ContextConfiguration({"/app-config.xml""/test-data-access-config.xml"})
09 @ActiveProfiles("dev")
10 @Transactional
11 public class UserRepositoryTests { }

我們可以通過一個自定義的組合注解來減少上述的重複量,將通用的測試配置集中起來,就像這樣:

1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @ContextConfiguration({"/app-config.xml""/test-data-access-config.xml"})
4 @ActiveProfiles("dev")
5 @Transactional
6 public @interface TransactionalDevTest { }

然後我們就可以像下麵一樣使用我們自定義的@TransactionalDevTest注解來簡化每個類的配置:

1 @RunWith(SpringRunner.class)
2 @TransactionalDevTest
3 public class OrderRepositoryTests { }
4  
5 @RunWith(SpringRunner.class)
6 @TransactionalDevTest
7 public class UserRepositoryTests { }

想獲得詳情,請查看Spring注解編程模型

最後更新:2017-05-18 10:32:41

  上一篇:go  rubylearning.com推出新的免費教程
  下一篇:go  斷開的管道?