日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Spring進行單元測試

簡介: 通過本文,您能夠在較短的時間內掌握使用 Spring 單元測試框架測試基于 Spring 的應用程序的方法,這套方法主要涵蓋如何使用 Spring 測試注釋來進行常見的 Junit4 或者 TestNG 的單元測試,同時支持訪問 Spring 的 beanFactory 和進行自動化的事務管理。

概述

單元測試和集成測試在我們的軟件開發(fā)整個流程中占有舉足輕重的地位,一方面,程序員通過編寫單元測試來驗證自己程序的有效性,另外一方面,管理者通過持續(xù)自動的執(zhí)行單元測試和分析單元測試的覆蓋率等來確保軟件本身的質量。這里,我們先不談單元測試本身的重要性,對于目前大多數(shù)的基于 Java 的企業(yè)應用軟件來說,Spring 已經(jīng)成為了標準配置,一方面它實現(xiàn)了程序之間的低耦合度,另外也通過一些配置減少了企業(yè)軟件集成的工作量,例如和 Hibernate、Struts 等的集成。那么,有個問題,在普遍使用 Spring 的應用程序中,我們如何去做單元測試?或者說,我們怎么樣能高效的在 Spring 生態(tài)系統(tǒng)中實現(xiàn)各種單元測試手段?這就是本文章要告訴大家的事情。

單元測試目前主要的框架包括 Junit、TestNG,還有些 MOCK 框架,例如 Jmock、Easymock、PowerMock 等,這些都是單元測試的利器,但是當把他們用在 Spring 的開發(fā)環(huán)境中,還是那么高效么?還好,Spring 提供了單元測試的強大支持,主要特性包括:

  • 支持主流的測試框架 Junit 和 TestNG
  • 支持在測試類中使用依賴注入 Denpendency Injection
  • 支持測試類的自動化事務管理
  • 支持使用各種注釋標簽,提高開發(fā)效率和代碼簡潔性
  • Spring 3.1 更是支持在測試類中使用非 XML 配置方法和基于 Profile 的 bean 配置模式

通過閱讀本文,您能夠快速的掌握基于 Spring TestContext 框架的測試方法,并了解基本的實現(xiàn)原理。本文將提供大量測試標簽的使用方法,通過這些標簽,開發(fā)人員能夠極大的減少編碼工作量。OK,現(xiàn)在讓我們開始 Spring 的測試之旅吧!

原來我們是怎么做的

這里先展示一個基于 Junit 的單元測試,這個單元測試運行在基于 Spring 的應用程序中,需要使用 Spring 的相關配置文件來進行測試。相關類圖如下:

數(shù)據(jù)庫表

假設有一個員工賬號表,保存了員工的基本賬號信息,表結構如下:

  • ID:整數(shù)類型,唯一標識
  • NAME:字符串,登錄賬號
  • SEX:字符串,性別
  • AGE:字符串,年齡

假設表已經(jīng)建好,且內容為空。

測試工程目錄結構和依賴 jar 包

在 Eclipse 中,我們可以展開工程目錄結構,看到如下圖所示的工程目錄結構和依賴的 jar 包列表:

您需要引入的 jar 包括:

  • cglib-nodep-2.2.3.jar
  • commons-logging.jar
  • hsqldb.jar
  • Junit-4.5.jar
  • log4j-1.2.14.jar
  • Spring-asm-3.2.0.M1.jar
  • Spring-beans-3.2.0.M1.jar
  • Spring-context-3.2.0.M1.jar
  • Spring-core-3.2.0.M1.jar
  • Spring-expression-3.2.0.M1.jar
  • Spring-jdbc-3.2.0.M1.jar
  • Spring-test-3.2.0.M1.jar
  • Spring-tx-3.2.0.M1.jar
  • testng-6.8.jar

其中的 hsqldb 是我們測試用數(shù)據(jù)庫。

圖 1. 工程目錄結構

類總體介紹

假設我們現(xiàn)在有一個基于 Spring 的應用程序,除了 MVC 層,還包括業(yè)務層和數(shù)據(jù)訪問層,業(yè)務層有一個類 AccountService,負責處理賬號類的業(yè)務,其依賴于數(shù)據(jù)訪問層 AccountDao 類,此類提供了基于 Spring Jdbc Template 實現(xiàn)的數(shù)據(jù)庫訪問方法,AccountService 和 AccountDao 以及他們之間的依賴關系都是通過 Spring 配置文件進行管理的。

現(xiàn)在我們要對 AccountService 類進行測試,在不使用 Spring 測試方法之前,我們需要這樣做:

清單 1. Account.Java

此類代表賬號的基本信息,提供 getter 和 setter 方法。

 
 
 
 
  1. package domain;
  2.  
  3. public class Account {
  4.     public static final String SEX_MALE = "male";
  5.     public static final String SEX_FEMALE = "female";
  6.  
  7.     private int id;
  8.     private String name;
  9.     private int age;
  10.     private String sex;
  11.     public String toString() {
  12.        return String.format("Account[id=%d,name=%s,age:%d,sex:%s]",id,name,age,sex);
  13.     }
  14.     public int getId() {
  15.         return id;
  16.     }
  17.     public void setId(int id) {
  18.         this.id = id;
  19.     }
  20.     public String getName() {
  21.         return name;
  22.     }
  23.     public void setName(String name) {
  24.         this.name = name;
  25.     }
  26.     public int getAge() {
  27.         return age;
  28.     }
  29.     public void setAge(int age) {
  30.         this.age = age;
  31.     }
  32.     public String getSex() {
  33.         return sex;
  34.     }
  35.     public void setSex(String sex) {
  36.         this.sex = sex;
  37.     }
  38.  
  39.     public static Account getAccount(int id,String name,int age,String sex) {
  40.         Account acct = new Account();
  41.         acct.setId(id);
  42.         acct.setName(name);
  43.         acct.setAge(age);
  44.         acct.setSex(sex);
  45.         return acct;
  46.     }
  47. }

注意上面的 Account 類有一個 toString() 方法和一個靜態(tài)的 getAccount 方法,getAccount 方法用于快速獲取 Account 測試對象。

清單 2. AccountDao.Java

這個 DAO 我們這里為了簡單起見,采用 Spring Jdbc Template 來實現(xiàn)。

 
 
 
 
  1. package DAO;
  2.  
  3. import Java.sql.ResultSet;
  4. import Java.sql.SQLException;
  5. import Java.util.HashMap;
  6. import Java.util.List;
  7. import Java.util.Map;
  8.  
  9. import org.Springframework.context.ApplicationContext;
  10. import org.Springframework.context.support.ClassPathXmlApplicationContext;
  11. import org.Springframework.jdbc.core.RowMapper;
  12. import org.Springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
  13. import org.Springframework.jdbc.core.simple.ParameterizedRowMapper;
  14.  
  15. import domain.Account;
  16.  
  17. public class AccountDao extends NamedParameterJdbcDaoSupport {
  18.     public void saveAccount(Account account) {
  19.         String sql = "insert into tbl_account(id,name,age,sex) " +
  20.                "values(:id,:name,:age,:sex)";
  21.         Map paramMap = new HashMap();
  22.         paramMap.put("id", account.getId());
  23.         paramMap.put("name", account.getName());
  24.         paramMap.put("age", account.getAge());
  25.         paramMap.put("sex",account.getSex());
  26.         getNamedParameterJdbcTemplate().update(sql, paramMap);
  27.     }
  28.  
  29.     public Account getAccountById(int id) {
  30.         String sql = "select id,name,age,sex from tbl_account where id=:id";
  31.         Map paramMap = new HashMap();
  32.         paramMap.put("id", id);
  33.         List matches = getNamedParameterJdbcTemplate().query(sql,
  34.         paramMap,new ParameterizedRowMapper() {
  35.                     @Override
  36.                     public Account mapRow(ResultSet rs, int rowNum)
  37.                             throws SQLException {
  38.                         Account a = new Account();
  39.                         a.setId(rs.getInt(1));
  40.                         a.setName(rs.getString(2));
  41.                         a.setAge(rs.getInt(3));
  42.                         a.setSex(rs.getString(4));
  43.                         return a;
  44.                     }
  45.  
  46.         });
  47.         return matches.size()>0?matches.get(0):null;
  48.     }
  49.  
  50. }

AccountDao 定義了幾個賬號對象的數(shù)據(jù)庫訪問方法:

  • saveAccount:負責把傳入的賬號對象入庫
  • getAccountById:負責根據(jù) Id 查詢賬號

#p#

清單 3. AccountService.Java

 
 
 
 
  1. package service;
  2.  
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.Springframework.beans.factory.annotation.Autowired;
  6.  
  7. import DAO.AccountDao;
  8. import domain.Account;
  9.  
  10. public class AccountService {
  11.     private static final Log log = LogFactory.getLog(AccountService.class);
  12.  
  13.     @Autowired
  14.     private AccountDao accountDao;
  15.  
  16.     public Account getAccountById(int id) {
  17.         return accountDao.getAccountById(id);
  18.     }
  19.  
  20.     public void insertIfNotExist(Account account) {
  21.         Account acct = accountDao.getAccountById(account.getId());
  22.         if(acct==null) {
  23.             log.debug("No "+account+" found,would insert it.");
  24.             accountDao.saveAccount(account);
  25.         }
  26.         acct = null;
  27.     }
  28.  
  29. }

AccountService 包括下列方法:

  • getAccountById:根據(jù) Id 查詢賬號信息
  • insertIfNotExist:根據(jù)傳入的對象插入數(shù)據(jù)庫

其依賴的 DAO 對象 accountDao 是通過 Spring 注釋標簽 @Autowired 自動注入的。

清單 4. Spring 配置文件

上述幾個類的依賴關系是通過 Spring 進行管理的,配置文件如下:

 
 
 
 
  1.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  xmlns:context="http://www.Springframework.org/schema/context"
  3.  xsi:schemaLocation="http://www.Springframework.org/schema/beans
  4.  
  5. http://www.Springframework.org/schema/beans/Spring-beans-3.0.xsd
  6.  
  7.  
  8. http://www.Springframework.org/schema/context
  9.  
  10.  http://www.Springframework.org/schema/context/Spring-context-3.0.xsd ">
  11.  
  12.  
  13.  
  14.          
  15.          
  16.          
  17.          
  18.      
  19.      
  20.      
  21.  
  22.          
  23.      
  24.  
  25.      
  26.  

注意其中的“”的作用,這個配置啟用了 Spring 對 Annotation 的支持,這樣在我們的測試類中 @Autowired 注釋才會起作用(如果用了 Spring 測試框架,則不需要這樣的配置項,稍后會演示)。另外還有一個 accountDao 依賴的 initer bean, 這個 bean 的作用是加載 log4j 日志環(huán)境,不是必須的。

另外還有一個要注意的地方,就是 datasource 的定義,由于我們使用的是 Spring Jdbc Template,所以只要定義一個 org.Springframework.jdbc.datasource.DriverManagerDataSource 類型的 datasource 即可。這里我們使用了簡單的數(shù)據(jù)庫 HSQL、Single Server 運行模式,通過 JDBC 進行訪問。實際測試中,大家可以選擇 Oracle 或者 DB2、Mysql 等。

好,萬事具備,下面我們來用 Junit4 框架測試 accountService 類。代碼如下:

清單 5. AccountServiceOldTest.Java

 
 
 
 
  1. package service;
  2.  
  3. import static org.Junit.Assert.assertEquals;
  4.  
  5. import org.Junit.BeforeClass;
  6. import org.Junit.Test;
  7. import org.Springframework.context.ApplicationContext;
  8. import org.Springframework.context.support.ClassPathXmlApplicationContext;
  9.  
  10. import domain.Account;
  11.  
  12. public class AccountServiceOldTest {
  13.     private static AccountService service;
  14.  
  15.     @BeforeClass
  16.     public static void init() {
  17.         ApplicationContext
  18. context = new ClassPathXmlApplicationContext("config/Spring-db-old.xml");
  19.         service = (AccountService)context.getBean("accountService");
  20.     } 
  21.  
  22.     @Test
  23.     public void testGetAcccountById() {
  24. Account acct = Account.getAccount(1, "user01", 18, "M");
  25.         Account acct2 = null;
  26.         try {
  27. service.insertIfNotExist(acct);
  28.             acct2 = service.getAccountById(1);
  29.             assertEquals(acct, acct2);
  30.         } catch (Exception ex) {
  31.             fail(ex.getMessage());
  32.         } finally {
  33.             service.removeAccount(acct);
  34.         }
  35. }
  36. }

注意上面的 Junit4 注釋標簽,***個注釋標簽 @BeforeClass,用來執(zhí)行整個測試類需要一次性初始化的環(huán)境,這里我們用 Spring 的 ClassPathXmlApplicationContext 從 XML 文件中加載了上面定義的 Spring 配置文件,并從中獲得了 accountService 的實例。第二個注釋標簽 @Test 用來進行實際的測試。

測試過程:我們先獲取一個 Account 實例對象,然后通過 service bean 插入數(shù)據(jù)庫中,然后通過 getAccountById 方法從數(shù)據(jù)庫再查詢這個記錄,如果能獲取,則判斷兩者的相等性;如果相同,則表示測試成功。成功后,我們嘗試刪除這個記錄,以利于下一個測試的進行,這里我們用了 try-catch-finally 來保證賬號信息會被清除。

執(zhí)行測試:(在 Eclipse 中,右鍵選擇 AccountServiceOldTest 類,點擊 Run as Junit test 選項),得到的結果如下:

執(zhí)行測試的結果

在 Eclipse 的 Junit 視圖中,我們可以看到如下的結果:

圖 2. 測試的結果

對于這種不使用 Spring test 框架進行的單元測試,我們注意到,需要做這些工作:

  • 在測試開始之前,需要手工加載 Spring 的配置文件,并獲取需要的 bean 實例
  • 在測試結束的時候,需要手工清空搭建的數(shù)據(jù)庫環(huán)境,比如清除您插入或者更新的數(shù)據(jù),以保證對下一個測試沒有影響

另外,在這個測試類中,我們還不能使用 Spring 的依賴注入特性。一切都靠手工編碼實現(xiàn)。好,那么我們看看 Spring test 框架能做到什么。

首先我們修改一下 Spring 的 XML 配置文件,刪除 行,其他不變。

清單 6. Spring-db1.xml

 
 
 
 
  1.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  xsi:schemaLocation="http://www.Springframework.org/schema/beans
  3.  
  4. http://www.Springframework.org/schema/beans/Spring-beans-3.2.xsd">
  5.  
  6.  
  7. >
  8.          
  9.          
  10.          
  11.          
  12.      
  13.  
  14. >
  15.          
  16.      
  17.      
  18.      
  19.  
  20.          
  21.      
  22.      
  23.      
  24.  

其中的 transactionManager 是 Spring test 框架用來做事務管理的管理器。

清單 7. AccountServiceTest1.Java

 
 
 
 
  1. package service;
  2. import static org.Junit.Assert.assertEquals;
  3.  
  4. import org.Junit.Test;
  5. import org.Junit.runner.RunWith;
  6. import org.Springframework.beans.factory.annotation.Autowired;
  7. import org.Springframework.test.context.ContextConfiguration;
  8. import org.Springframework.test.context.Junit4.SpringJUnit4ClassRunner;
  9. import org.Springframework.transaction.annotation.Transactional;
  10.  
  11. import domain.Account;
  12.  
  13. @RunWith(SpringJUnit4ClassRunner.class)
  14. @ContextConfiguration("/config/Spring-db1.xml")
  15. @Transactional
  16. public class AccountServiceTest1 {
  17.     @Autowired
  18.     private AccountService service;
  19.  
  20.     @Test
  21.     public void testGetAcccountById() {
  22. Account acct = Account.getAccount(1, "user01", 18, "M");
  23.         service.insertIfNotExist(acct);
  24.         Account acct2 = service.getAccountById(1);
  25.         assertEquals(acct,acct2);
  26.     }
  27. }

對這個類解釋一下:

  • @RunWith 注釋標簽是 Junit 提供的,用來說明此測試類的運行者,這里用了 SpringJUnit4ClassRunner,這個類是一個針對 Junit 運行環(huán)境的自定義擴展,用來標準化在 Spring 環(huán)境中 Junit4.5 的測試用例,例如支持的注釋標簽的標準化
  • @ContextConfiguration 注釋標簽是 Spring test context 提供的,用來指定 Spring 配置信息的來源,支持指定 XML 文件位置或者 Spring 配置類名,這里我們指定 classpath 下的 /config/Spring-db1.xml 為配置文件的位置
  • @Transactional 注釋標簽是表明此測試類的事務啟用,這樣所有的測試方案都會自動的 rollback,即您不用自己清除自己所做的任何對數(shù)據(jù)庫的變更了
  • @Autowired 體現(xiàn)了我們的測試類也是在 Spring 的容器中管理的,他可以獲取容器的 bean 的注入,您不用自己手工獲取要測試的 bean 實例了
  • testGetAccountById 是我們的測試用例:注意和上面的 AccountServiceOldTest 中相同的測試方法的對比,這里我們不用再 try-catch-finally 了,事務管理自動運行,當我們執(zhí)行完成后,所有相關變更會被自動清除

執(zhí)行結果

在 Eclipse 的 Junit 視圖中,我們可以看到如下的結果:

圖 3. 執(zhí)行結果

小結

如果您希望在 Spring 環(huán)境中進行單元測試,那么可以做如下配置:

  • 繼續(xù)使用 Junit4 測試框架,包括其 @Test 注釋標簽和相關的類和方法的定義,這些都不用變
  • 您需要通過 @RunWith(SpringJUnit4ClassRunner.class) 來啟動 Spring 對測試類的支持
  • 您需要通過 @ContextConfiguration 注釋標簽來指定 Spring 配置文件或者配置類的位置
  • 您需要通過 @Transactional 來啟用自動的事務管理
  • 您可以使用 @Autowired 自動織入 Spring 的 bean 用來測試

另外您不再需要:

  • 手工加載 Spring 的配置文件
  • 手工清理數(shù)據(jù)庫的每次變更
  • 手工獲取 application context 然后獲取 bean 實例

Spring 測試注釋標簽
我們已經(jīng)看到利用 Spring test framework 來進行基于 Junit4 的單元測試是多么的簡單,下面我們來看一下前面遇到的各種注釋標簽的一些可選用法。

@ContextConfiguration 和 @Configuration 的使用

剛才已經(jīng)介紹過,可以輸入 Spring xml 文件的位置,Spring test framework 會自動加載 XML 文件,得到 application context,當然也可以使用 Spring 3.0 新提供的特性 @Configuration,這個注釋標簽允許您用 Java 語言來定義 bean 實例,舉個例子:

現(xiàn)在我們將前面定義的 Spring-db1.xml 進行修改,我們希望其中的三個 bean:initer、accountDao、accountService 通過配置類來定義,而不是 XML,則我們需要定義如下配置類:

注意:如果您想使用 @Configuration,請在 classpath 中加入 cglib 的 jar 包(cglib-nodep-2.2.3.jar),否則會報錯。

#p#

清單 8. SpringDb2Config.Java

 
 
 
 
  1. package config;
  2.  
  3. import org.Springframework.beans.factory.annotation.Autowired;
  4. import org.Springframework.context.annotation.Bean;
  5. import org.Springframework.context.annotation.Configuration;
  6. import org.Springframework.jdbc.datasource.DriverManagerDataSource;
  7.  
  8. import service.AccountService;
  9. import service.Initializer;
  10. import DAO.AccountDao;
  11.  
  12. @Configuration
  13. public class SpringDb2Config {
  14.     private @Autowired DriverManagerDataSource datasource;
  15.     @Bean
  16.     public Initializer initer() {
  17.         return new Initializer();
  18.     }
  19.  
  20.     @Bean
  21.     public AccountDao accountDao() {
  22. AccountDao DAO = new AccountDao();
  23. DAO.setDataSource(datasource);
  24. return DAO;
  25.     }
  26.  
  27.     @Bean
  28.     public AccountService accountService() {
  29. return new AccountService();
  30.     }
  31. }

注意上面的注釋標簽:

  • @Configuration:表明這個類是一個 Spring 配置類,提供 Spring 的 bean 定義,實際效果等同于 XML 配置方法
  • @Bean:表明這個方法是一個 bean 的定義,缺省情況下,方法名稱就是 bean 的 Id
  • @Autowired:這個 datasource 采用自動注入的方式獲取

注意,我們采用的是 XML+config bean 的方式進行配置,這種方式比較符合實際項目的情況。相關的 Spring 配置文件也要做變化,如下清單所示:

清單 9. Spring-db2.xml

 
 
 
 
  1.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  xmlns:context="http://www.Springframework.org/schema/context"
  3.  xsi:schemaLocation="http://www.Springframework.org/schema/beans
  4.  
  5. http://www.Springframework.org/schema/beans/Spring-beans-3.0.xsd
  6.  
  7.  
  8. http://www.Springframework.org/schema/context
  9.  
  10.  
  11. http://www.Springframework.org/schema/context/Spring-context-3.0.xsd">
  12.  
  13.  
  14.  
  15. >
  16.          
  17.          
  18.          
  19.          
  20.      
  21.  
  22.          >
  23.          
  24.      
  25.  
  26.      
  27.  

注意里面的 context 命名空間的定義,如代碼中黑體字所示。另外還必須有 的定義,這個定義允許采用注釋標簽的方式來控制 Spring 的容器,***我們看到 beans 已經(jīng)沒有 initer、accountDao 和 accountService 這些 bean 的定義,取而代之的是一個 SpringDb2Config bean 的定義,注意這個 bean 沒有名稱,因為不需要被引用。

現(xiàn)在有了這些配置,我們的測試類只要稍稍修改一下,即可實現(xiàn)加載配置類的效果,如下:

 
 
 
 
  1. @ContextConfiguration("/config/Spring-db2.xml")

通過上面的配置,測試用例就可以實現(xiàn)加載 Spring 配置類,運行結果也是成功的 green bar。

@DirtiesContext

缺省情況下,Spring 測試框架一旦加載 applicationContext 后,將一直緩存,不會改變,但是,

由于 Spring 允許在運行期修改 applicationContext 的定義,例如在運行期獲取 applicationContext,然后調用 registerSingleton 方法來動態(tài)的注冊新的 bean,這樣的情況下,如果我們還使用 Spring 測試框架的被修改過 applicationContext,則會帶來測試問題,我們必須能夠在運行期重新加載 applicationContext,這個時候,我們可以在測試類或者方法上注釋:@DirtiesContext,作用如下:

  • 如果定義在類上(缺省),則在此測試類運行完成后,重新加載 applicationContext
  • 如果定義在方法上,即表示測試方法運行完成后,重新加載 applicationContext

@TransactionConfiguration 和 @Rollback
缺省情況下,Spring 測試框架將事務管理委托到名為 transactionManager 的 bean 上,如果您的事務管理器不是這個名字,那需要指定 transactionManager 屬性名稱,還可以指定 defaultRollback 屬性,缺省為 true,即所有的方法都 rollback,您可以指定為 false,這樣,在一些需要 rollback 的方法,指定注釋標簽 @Rollback(true)即可。

對 Junit4 的注釋標簽支持

看了上面 Spring 測試框架的注釋標簽,我們來看看一些常見的基于 Junit4 的注釋標簽在 Spring 測試環(huán)境中的使用方法。

@Test(expected=…)

此注釋標簽的含義是,這是一個測試,期待一個異常的發(fā)生,期待的異常通過 xxx.class 標識。例如,我們修改 AccountService.Java 的 insertIfNotExist 方法,對于傳入的參數(shù)如果為空,則拋出 IllegalArgumentException,如下:

 
 
 
 
  1. public void insertIfNotExist(Account account) {
  2.     if(account==null)
  3.         throw new IllegalArgumentException("account is null");
  4.     Account acct = accountDao.getAccountById(account.getId());
  5.     if(acct==null) {
  6.         log.debug("No "+account+" found,would insert it.");
  7.         accountDao.saveAccount(account);
  8.     }
  9.     acct = null;
  10. }

然后,在測試類中增加一個測試異常的方法,如下:

 
 
 
 
  1. @Test(expected=IllegalArgumentException.class)
  2. public void testInsertException() {
  3.     service.insertIfNotExist(null);
  4. }

運行結果是 green bar。

@Test(timeout=…)

可以給測試方法指定超時時間(毫秒級別),當測試方法的執(zhí)行時間超過此值,則失敗。

比如在 AccountService 中增加如下方法:

 
 
 
 
  1. public void doSomeHugeJob() {
  2.     try {
  3.         Thread.sleep(2*1000);
  4.     } catch (InterruptedException e) {
  5.     }
  6. }

上述方法模擬任務執(zhí)行時間 2 秒,則測試方法如下:

 
 
 
 
  1. @Test(timeout=3000)
  2. public void testHugeJob() {
  3.     service.doSomeHugeJob();
  4. }

上述測試方法期待 service.doSomeHugeJob 方法能在 3 秒內結束,執(zhí)行測試結果是 green bar。

@Repeat

通過 @Repeat,您可以輕松的多次執(zhí)行測試用例,而不用自己寫 for 循環(huán),使用方法:

 
 
 
 
  1. @Repeat(3)
  2. @Test(expected=IllegalArgumentException.class)
  3. public void testInsertException() {
  4.     service.insertIfNotExist(null);
  5. }

這樣,testInsertException 就能被執(zhí)行 3 次。

在測試類中基于 profile 加載測試 bean

從 Spring 3.2 以后,Spring 開始支持使用 @ActiveProfiles 來指定測試類加載的配置包,比如您的配置文件只有一個,但是需要兼容生產環(huán)境的配置和單元測試的配置,那么您可以使用 profile 的方式來定義 beans,如下:

清單 10. Spring-db.xml

 
 
 
 
  1.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  xsi:schemaLocation="http://www.Springframework.org/schema/beans
  3.  
  4. http://www.Springframework.org/schema/beans/Spring-beans-3.2.xsd">
  5.  
  6.      
  7.  
  8. >
  9.  
  10.      
  11.      
  12.      
  13.      
  14.  
  15.  
  16. >
  17.      
  18.      
  19.      
  20.      
  21.      
  22.  
  23.  
  24.  
  25.     >
  26.      
  27.      
  28.      
  29.      
  30.    當前名稱:使用Spring進行單元測試
    路徑分享:http://www.5511xx.com/article/dpjddpg.html