水仁博客

          上善若水,仁恕載物
          隨筆 - 11, 文章 - 0, 評論 - 4, 引用 - 0
          數據加載中……

          Spring 集成測試

          8.3.1. Context管理和緩存


          Spring 中的包 spring-mock.jar 為集成測試提供了一流的支持。所有相關的API在包 org.springframework.test 中,它們不依賴于任何應用服務器或者其他部署環境。

          test包里的各種抽象類提供了如下的功能:
          • 各測試案例執行期間的Spring IoC容器緩存。
          • 測試fixture自身的依賴注入。
          • 適合集成測試的事務管理。
          • 繼承而來的對測試有用的各種實例變量。

          test包對加載的Context提供緩存,緩存功能是通過 AbstractDependencyInjectionSpringContextTests 類的一個方法(如下)實現的,此方法提供contexts xml的位置,且實現這個方法的類必須提供一個包含XML配置文件位置數組。缺省情況下,一旦加載后,這些配置將被所有的測試案例重用。

          protected abstract String[] getConfigLocations();

          當配置環境受到破壞,AbstractDependencyInjectionSpringContextTests 的 setDirty() 方法可以用來重新加載配置,并在執行下一個測試案例前重建application context。

          8.3.2. 測試fixture的依賴注入

          AbstractDependencyInjectionSpringContextTests 類將從getConfigLocations()方法指定的配置文件中自動查找你要測試的類, 并通過Setter注入該類的實例。

          簡單例子

          public class HibernateTitleDaoTests extends AbstractDependencyInjectionSpringContextTests {

          // 被測試類的實例將被(自動的)依賴注入
          private HibernateTitleDao titleDao;

          // 一個用來實現'titleDao'實例變量依賴注入的setter方法
          public void setTitleDao (HibernateTitleDao titleDao) {
          this.titleDao = titleDao;
          }

          public void testLoadTitle() throws Exception {
          Title title = this.titleDao.loadTitle(new Long10));
          assertNotNull(title);
          }

          //指定Spring配置文件加載這個fixture
          protected String[] getConfigLocations() {
          return new String[] { "classpath:com/foo/daos.xml" };
          }

          }

          getConfigLocations() 使用的是 根據類型的自動裝配(autowire byType)來注入的,所以如果你有多個bean都定義為一個類型,則對這些bean你不能用這個方法。在這種情況下你要使用 applicationContext 實例變量,并且使用 getBean() 來進行顯式查找。

          如果你的測試案例不使用依賴注入,只要不定義任何setters方法即可; 或者你可以繼承 org.springframework.test.AbstractSpringContextTests 類,它只包括用來加載Spring Context的便利方法,并且在測試fixture中不進行依賴注入。

          8.3.3. 事務管理

          測試對持久存儲的數據會有改動。類 AbstractTransactionalDataSourceSpringContextTests 在缺省情況下,對每一個測試案例,他們創建并且回滾一個事務。所以使用這個類就不用擔心數據被修改;它依賴于Application Context中定義的一個bean PlatformTransactionManager。

          如果你確實想在測試時修改數據,可以用這個類的 setComplete() 方法,這將提交而不是回滾事務。另外, endTransaction() 方法可以在測試結束前中止事務。

          8.3.4. 方便的變量

          AbstractDependencyInjectionSpringContextTests 類提供了兩個保護屬性性實例變量:

          • applicationContext (a ConfigurableApplicationContext): 可以利用它進行顯式bean查找,或者作為一個整體來測試這個Context的狀態。
          • jdbcTemplate : 對確定數據狀態的查詢很有用。

          8.3.5. 示例

          Spring的PetClinic實例展示了這些測試超類的用法

          public abstract class AbstractClinicTests extends AbstractTransactionalDataSourceSpringContextTests {

          protected Clinic clinic;

          public void setClinic(Clinic clinic) {
          this.clinic = clinic;
          }

          public void testGetVets() {
          Collection vets = this.clinic.getVets();
          assertEquals('JDBC query must show the same number of vets',
          jdbcTemplate.queryForInt('SELECT COUNT(0) FROM VETS'),
          vets.size());
          Vet v1 = (Vet) EntityUtils.getById(vets, Vet.class, 2);
          assertEquals('Leary', v1.getLastName());
          assertEquals(1, v1.getNrOfSpecialties());
          assertEquals('radiology', ((Specialty) v1.getSpecialties().get(0)).getName());
          Vet v2 = (Vet) EntityUtils.getById(vets, Vet.class, 3);
          assertEquals('Douglas', v2.getLastName());
          assertEquals(2, v2.getNrOfSpecialties());
          assertEquals('dentistry', ((Specialty) v2.getSpecialties().get(0)).getName());
          assertEquals('surgery', ((Specialty) v2.getSpecialties().get(1)).getName());
          }

          JdbcTemplate 變量用于驗證被測試的代碼是否正確。JdbcTemplate 讓測試更嚴密,且減少了對測試數據的依賴。例如,可以在不中止測試的情況下在數據庫里增加額外的數據行。

          PetClinic應用支持四種數據訪問技術--JDBC、Hibernate、TopLink和JPA ,因此 AbstractClinicTests 類不指定Context位置,這個操作在子類中實現:

          例如,用Hibernate實現的PetClinic測試包含如下方法:

          public class HibernateClinicTests extends AbstractClinicTests {

          protected String[] getConfigLocations() {
          return new String[] {
          '/org/springframework/samples/petclinic/hibernate/applicationContext-hibernate.xml'
          };
          }
          }

          8.3.6. 運行集成測試

          集成測試比單元測試更依賴于測試環境,它是測試的一個補充,而不是代替單元測試的。這種依賴主要指完整數據模型的數據庫。也可以通過DbUnit或者數據庫工具來導入測試數據。

          posted on 2008-01-13 21:57 水仁圭 閱讀(1450) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 南康市| 海晏县| 东辽县| 富裕县| 洛川县| 垦利县| 华蓥市| 定边县| 黎城县| 秦皇岛市| 弥渡县| 哈巴河县| 靖州| 科技| 舟曲县| 革吉县| 元谋县| 胶南市| 文化| 雷山县| 招远市| 涿州市| 康马县| 台州市| 张掖市| 海盐县| 古交市| 高密市| 甘肃省| 凤城市| 兖州市| 米林县| 朝阳区| 黑山县| 清流县| 阿坝| 溧阳市| 宾阳县| 仪陇县| 明星| 平乡县|