Sky's blog

          我和我追逐的夢

          常用鏈接

          統計

          其他鏈接

          友情鏈接

          最新評論

          easymock教程-參數匹配

              easymock中提供了非常多的方法來實現參數匹配,基本能滿足一般參數匹配的要求。

              我們來具體看一下到底有哪些方法:

          (1) 基于基本類型的比較

                  1. eq(X value)方法, X 可以是boolean,byte,char, double,float,int,long,short,T

                      有多個重載方法,支持基本類型如boolean, byte,char, double,float,int, long,short,后面會介紹它也支持Object比較。

                      這個eq()方法的用法直接了當,基本數值直接比較數值,對于非整型的double和float,由于存在精度的問題,因此增加了以下兩個方法來指定比較精度。

          eq(double value, double delta) 
          eq(
          float value, float delta) 


           2. aryEq(X[] values) X 可以是boolean,byte,char, double,float,int,long,short,T

                      這個是eq(X value)方法的數組版本,要求比較的兩個數組擁有相同的長度,然后每個元素都"相同",即都可以滿足eq(X value)方法。

                      注意到double和float并沒有像eq(X value)方法那樣提供可以設置精度的重載版本,不知道在數組比較時如何去設置容許精度。

           3. gt(X value), lt(X value), X 可以是byte,double,float,int,long,short

                      這兩個方法用于參數的大小匹配,適用于數值型的基本類型如byte,double,float,int,long,short。

           4. geq(X value), leq(X value)

                      類似gt()和lt(),無非是將">"改為">=", "<"改為"<="。

           5. anyX(), X可以是Boolean, Byte, Char, Double, Float, Int, Long, Short

                      這是一個寬松的匹配方法,任何數值都被視為匹配OK。這個方法在我們不介意參數值時特別有用。

          (2) 基于對象的比較

           1. eq(T value)方法

                      和基本類型類似,不過對于Object,是通過調用equals()方法來進行比較。

           2. same(T value) 方法

                      和eq()不同,same()是通過比較對象引用來進行比較的。類似java代碼中, a.equals(b)和a == b的差別。

           3. anyObject() 和 anyObject(Class<T> clazz)

                      類似基本類型的any***()方法,非常寬松,在我們不介意參數值時使用。

                      使用方式有三種

          (T)EasyMock.anyObject() // 強制類型轉換
          EasyMock.<T> anyObject() // 固定返回的泛型
          EasyMock.anyObject(T.class) // 在參數中指定返回的泛型 
                  4. isA(Class<T> clazz)

                      和anyObject(Class<T> clazz) 非常,唯一一個差別在于當輸入參數為null時,anyObject(Class<T> clazz)返回true而isA(Class<T> clazz) 返回false。

          (3) 邏輯計算

              easymock支持在參數匹配時進行一些簡單的邏輯計算, 如and(), or (), not()。

              not()容易理解,取反而已。or()也容易理解,兩個匹配方法匹配一個即可。

              但是and()方法我沒能理解,不知道該怎么用,兩個匹配方法同時匹配? 有知道的朋友,還望指教。 

           

             此外在參數匹配中,有幾個特殊角色,享受的待遇與眾不同,easymock為它們提供了專有方法。

          1. Comparable

                  對于實現了Comparable接口的對象,easymock提供了一系列的專用方法來處理,包括eq, gt, lt, geq, leq:

          cmpEq(Comparable<T> value)
          gt(Comparable<T> value)
          lt(Comparable<T> value)
          geq(Comparable<T> value)
          leq(Comparable<T> value)

                  這個特殊處理非常合理,本來Comparable接口就提供了比較的功能,在參數匹配時應該容許直接使用。

          2. string

                  由于字符串匹配使用的場景非常多,因此easymock為此也提供了幾個常見的參數匹配方法:

          contains(String substring)
          startsWith(String prefix)
          endsWith(String suffix)
          find(String regex)

           其中contains/startsWith/endsWith是簡單的字符串查找,而find()則通過支持正則表達式來提供復雜匹配。

          3. null

                  對于Object匹配,很常見的一個場景就是輸入的參數為null,easymock中提供isNull() 和 notNull() 兩個方法來完成對null值的匹配。

                  開發中,經常會遇到下面這種場景,期望輸入的參數滿足isA()或者容許為null。而直接使用isA(),是不能支持null的,即如果參數為null時isA()會報不匹配。這個不是easymock的bug,而是刻意而為,解決的方法是使用 or(isA(...), isNull(...))或者anyObject()。

           

          service.execute((ClassA) EasyMock.or(EasyMock.isA(ClassA.class), EasyMock.isNull()));
          service.execute(EasyMock.anyObject(ClassA.
          class));


           

          posted on 2010-11-29 18:57 sky ao 閱讀(4923) 評論(2)  編輯  收藏 所屬分類: software test

          評論

          # re: easymock教程-參數匹配 2010-11-30 19:04 xu

          我的理解是:and的情況是判斷傳入的參數的情況,如判斷參數的值是否既大于1又小于5,如下所示:
          expect(a.getB(and(lt(5), gt(1)), and(lt(5), gt(1)))).andReturn("str");  回復  更多評論   

          # re: easymock教程-參數匹配[未登錄] 2010-11-30 22:19 sky

          恩,很有道理,是我沒有想到區間的問題。

          非常感謝!  回復  更多評論   

          主站蜘蛛池模板: 郯城县| 翁牛特旗| 上栗县| 泸溪县| 洪湖市| 新乐市| 乡城县| 高雄市| 响水县| 郎溪县| 民乐县| 新民市| 晋江市| 江西省| 富裕县| 宜兴市| 云和县| 闽侯县| 包头市| 定州市| 温泉县| 兴仁县| 滁州市| 白城市| 海淀区| 什邡市| 阿拉善左旗| 新龙县| 天长市| 嘉峪关市| 犍为县| 乌兰察布市| 广灵县| 信宜市| 长白| 闽清县| 三门峡市| 曲阳县| 德惠市| 五河县| 抚州市|