<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1732) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 最新国产成人亚洲精品影院| 91精品成人免费国产| 亚洲黄黄黄网站在线观看| 你是我的城池营垒免费看| 精品亚洲国产成AV人片传媒| 女人18毛片水最多免费观看| 亚洲免费日韩无码系列| 亚洲日本香蕉视频| 亚洲人成无码久久电影网站| 亚欧人成精品免费观看| 免费人成再在线观看网站| 亚洲精品免费在线视频| xvideos亚洲永久网址| 99热在线精品免费播放6| 免费无码AV一区二区| 亚洲欧洲日产v特级毛片| 国产乱辈通伦影片在线播放亚洲 | 国产亚洲精品福利在线无卡一 | 在线免费观看污网站| 国产麻豆成人传媒免费观看| 亚洲经典千人经典日产| 亚洲一区二区在线视频| 亚洲中文字幕无码专区| 免费特级黄毛片在线成人观看| 国产高清不卡免费视频| 一级人做人爰a全过程免费视频| 亚洲免费在线观看视频| 国产精一品亚洲二区在线播放| 亚洲黄网站wwwwww| 亚洲av午夜精品一区二区三区 | 成年在线观看免费人视频草莓| 成全高清在线观看免费| 美女被暴羞羞免费视频| 亚洲中文字幕无码中文| 亚洲综合国产精品| 国产亚洲精品资在线| 可以免费观看的一级毛片| 成在人线AV无码免费| 久久久久久久91精品免费观看| a级毛片100部免费观看| a一级毛片免费高清在线|