Sky's blog

          我和我追逐的夢

          常用鏈接

          統計

          其他鏈接

          友情鏈接

          最新評論

          easymock教程-單元測試中的主要測試對象和依賴

               在單元測試中,通常我們都會有一個明確的測試對象,我們測試的主要目的就是為了驗證這個類的工作如我們預期。

               以下面的簡單代碼為例:


           

                  public interface UserService {
                      User query(String userId);
                  }


                  
          public class UserServiceImpl implements UserService {
                      
          private UserDao userDao; 
                      
          public User query(String userId) {
                          
          return userDao.getById(userId);
                      }

                      
                      
          public void setUserDao(UserDao userDao) {
                          
          this.userDao = userDao;
                      }

                  }


                  
          public interface UserDao {
                      User getById(String userId);
                  }


                  
          public class UserDaoImpl implements UserDao {

                      
          private Datasource dataSource;

                      
          public User getById(String id) {
                          User user 
          = new User();
                          
          //execute database query
                          user.set..
                          
          return user;
                      }


                      
          public void setDatasource(Datasource datasource) {
                          
          this.datasource = datasource;
                      }

                      
                  }



              這里我們定義有兩個interface: UserService 和 UserDao, 并給出了兩個實現類UserServiceImpl 和 UserDaoImpl。 其中UserServiceImpl依賴到UserDao,通過setter方法可以注入一個UserDao實現。而UserDaoImpl的實現則依賴到Datasource。

                然后我們來為實現類UserServiceImpl 和 UserDaoImpl編寫單元測試:

           1. UserServiceImplTest

          public class UserServiceImplTest {

              @Test
              
          public void testQuery() {
                  User expectedUser 
          = new User();
                  expectedUser.setId(
          "1001");
                  expectedUser.setAge(
          30);
                  expectedUser.setName(
          "user-1001");
                  UserDao userDao  
          = EasyMock.createMock(UserDao.class);
                  EasyMock.expect(userDao.getById(
          "1001")).andReturn(expectedUser);
                  EasyMock.replay(userDao);

                  UserServiceImpl  service 
          = new UserServiceImpl();
                  service.setUserDao(userDao);
                  User user 
          = service.query("1001");
                  assertNotNull(user);
                  assertEquals(
          "1001", user.getId()); 
                  assertEquals(
          30, user.getAge()); 
                  assertEquals(
          "user-1001", user.getName()); 

                  EasyMock.verify(userDao);
              }

          }

           

              在這個測試類中,主要測試對象就是UserServiceImpl,對于UserServiceImpl的依賴UserDao,我們采取mock這個UserDao來滿足UserServiceImpl的測試需要。

           2. UserDaoImplTest

               代碼示例就不詳細寫了,和上面的類似,主要測試對象就是UserDaoImpl, 我們將通過mock Datasource來滿足UserDaoImpl對datasource的測試需要。

               可以從上面的例子中簡單的看出,通常單元測試都遵循這樣的慣例: AClass的單元測試類命名為AclassTest,主要職責是測試AClass的行為,理所當然的主要測試對象就是AClass。而所有被AClass的依賴則自然而然的成為次要測試對象,通常我們都不關注這些依賴的內部實現,也不會要求在AClass的單元測試案例中對這些依賴的實現進行測試和驗證。

               這也符合單元測試的理念: 我們將類AClass定義為單元,測試這個單元的行為是否如預期。同時也符合UserServiceImpl的實現邏輯:UserServiceImpl依賴到UserDao接口,并不直接依賴到UserDaoImpl,因此在UserServiceImpl的單元測試中,也不應該引入UserDaoImpl這樣的真實類,mock框架在這個時候是最適合出場表演的了:我們可以通過mock UserDao來模擬出UserDao的各種行為以便檢測UserServiceImpl在這些行為下的處理是否正確: 不同的返回值,錯誤場景,異常場景。這也是mock框架在單元測試中被廣泛使用的原因:還有什么比mock 類更能方便的做到這些?

          posted on 2010-10-14 14:01 sky ao 閱讀(1735) 評論(0)  編輯  收藏 所屬分類: software test

          主站蜘蛛池模板: 刚察县| 紫金县| 巧家县| 沾化县| 东阳市| 萨嘎县| 五常市| 长垣县| 道孚县| 敖汉旗| 灯塔市| 南阳市| 伊川县| 昭觉县| 武山县| 连江县| 溧阳市| 香河县| 阿鲁科尔沁旗| 克拉玛依市| 会泽县| 那坡县| 安庆市| 曲麻莱县| 广平县| 延长县| 涡阳县| 类乌齐县| 黄浦区| 田阳县| 石景山区| 江达县| 鞍山市| 蕲春县| 玛多县| 武安市| 昔阳县| 壶关县| 凤阳县| 磐安县| 鄂伦春自治旗|