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

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 社会| 安庆市| 沈阳市| 彩票| 原阳县| 罗源县| 鹤岗市| 调兵山市| 沂源县| 桓台县| 灵武市| 博爱县| 耒阳市| 甘德县| 台南市| 潼关县| 嘉义县| 大兴区| 永康市| 宝山区| 广宗县| 务川| 靖边县| 大兴区| 防城港市| 增城市| 顺平县| 铜川市| 浙江省| 仪陇县| 连江县| 衡阳市| 岐山县| 登封市| 枣强县| 阜宁县| 应城市| 屏东县| 疏勒县| 阳曲县| 桐乡市|