JMock的基本使用方法

          JMock是幫助創建mock對象的工具,它基于Java開發,在Java測試與開發環境中有不可比擬的優勢,更重要的是,它大大簡化了虛擬對象的使用。本文中,通過一個簡單的測試用例來說明JMock如何幫助我們實現這種孤立測試。
              我們在測試某類時,由于它要與其他類發生聯系,因此往往在測試此類的代碼中也將與之聯系的類也一起測試了。這種測試,將使被測試的類直接依賴于其他類,一旦其他類發生改變,被測試類也隨之被迫改變。更重要的是,這些其他類可能尚未經過測試,因此必須先測試這些類,才能測試被測試類。這種情況下,測試驅動開發成為空談。而如果其他類中也引用了被測試類,我們到底先測試哪一個類?因此,在測試中,如果我們能將被測試類孤立起來,使其完全不依賴于其他類的具體實現,這樣,我們就能做到測試先行,先測試哪個類,就先實現哪個類,而不管與之聯系的類是否已經實現。

              虛擬對象(mock object)就是為此需要而誕生的。它通過JDK中的反射機制,在運行時動態地創建虛擬對象。在測試代碼中,我們可以驗證這些虛擬對象是否被正確地調用了,也可以在明確的情況下,讓其返回特定的假想值。而一旦有了這些虛擬對象提供的服務,被測試類就可以將虛擬對象作為其他與之聯系的真實對象的替身,從而輕松地搭建起一個很完美的測試環境。

              JMock是幫助創建mock對象的工具,它基于Java開發,在Java測試與開發環境中有不可比擬的優勢,更重要的是,它大大簡化了虛擬對象的使用。

              本文中,通過一個簡單的測試用例來說明JMock如何幫助我們實現這種孤立測試。有三個主要的類,User,UserDAO,及UserService。本文中,我們只需測試UserService,準備虛擬UserDAO。對于User,由于本身僅是一個過于簡單的POJO,可以不用測試。但如果你是一個完美主義者,也可以使用JMock的虛擬它。在這領域,JMock幾乎無所不能。

          這里我用到的是:(我用的是maven依賴)

                      <dependency>
             <groupId>org.jmock</groupId>
             <artifactId>jmock</artifactId>
             <version>2.5.1</version>
          </dependency>
           
          <dependency>
             <groupId>org.jmock</groupId>
             <artifactId>jmock-junit3</artifactId>
             <version>2.5.1</version>
          </dependency>

          在官方的網站上也有的下載。   地址:  http://jmock.org/dist/jmock-2.5.1-jars.zip

           


          public class User {
          private String name;
          public User() {
          }
          public User(String name) {
          this.name = name;
          }
          public String getName() {
          return name;
          }
          public void setName(String name) {
          this.name = name;
          }
          }

           UserDAO負責與數據庫打交道,通過數據庫保存、獲取User的信息。盡管我們可以不用知道JMock如何通過JDK 的反射機制來實現孤立測試,但至少應知道,JDK的反射機制要求這些在運行時創建的動態類必須定義接口。在使用JMock的環境中,由于我們要虛擬 UserDAO,意味著UserDAO必須定義接口

          public interface UserDAO {
          public User getUser(Long id);
          }

          public interface UserService {
          public void setUserDAO(UserDAO userDAO);
          public User getUser(Long id);
          }



          public class UserServiceImpl implements UserService {
          private UserDAO userDAO;
          public UserServiceImpl() {
          }
          public void setUserDAO(UserDAO userDAO) {
          this.userDAO = userDAO;
          }
          public User getUser(Long id) {
          return userDAO.getUser(id);
          }
          }


           
          import org.jmock.Expectations;
          import org.jmock.integration.junit3.MockObjectTestCase;

          public class UserServiceTest extends MockObjectTestCase {
          private UserService userService = new UserServiceImpl();
          private UserDAO userDAO = null;
          public UserServiceTest(String testName) {
          super(testName);
          }
          protected void setUp() throws Exception {
          userDAO = mock(UserDAO.class);
          userService.setUserDAO(userDAO);
          }
          public void testGetUser() {
          String name = "lsb";
          final User fakeUser = new User(name);
          checking(new Expectations(){{
                      oneOf(userDAO).getUser(1L);
                      will(returnValue(fakeUser));
                  }});
          User user = userService.getUser(1L);
          assertNotNull(user);
          assertEquals(name, user.getName());
          }
          protected void tearDown() throws Exception {
          }
          }

          posted on 2012-02-23 21:52 胡鵬 閱讀(866) 評論(0)  編輯  收藏


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


          網站導航:
           

          導航

          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 衡山县| 观塘区| 沂源县| 大姚县| 沿河| 象州县| 格尔木市| 田阳县| 晋州市| 松溪县| 盐源县| 汽车| 北票市| 新安县| 栖霞市| 四会市| 恩平市| 象州县| 广饶县| 东光县| 清徐县| 扎囊县| 文山县| 保靖县| 江阴市| 凤翔县| 西峡县| 巴林右旗| 禄劝| 唐河县| 玉树县| 宁国市| 成都市| 舒兰市| 文昌市| 洱源县| 台东县| 伊通| 南陵县| 怀化市| 黔江区|