easymock中提供了非常多的方法來實(shí)現(xiàn)參數(shù)匹配,基本能滿足一般參數(shù)匹配的要求。
我們來具體看一下到底有哪些方法:
(1) 基于基本類型的比較
1. eq(X value)方法, X 可以是boolean,byte,char, double,float,int,long,short,T
有多個(gè)重載方法,支持基本類型如boolean, byte,char, double,float,int, long,short,后面會(huì)介紹它也支持Object比較。
這個(gè)eq()方法的用法直接了當(dāng),基本數(shù)值直接比較數(shù)值,對(duì)于非整型的double和float,由于存在精度的問題,因此增加了以下兩個(gè)方法來指定比較精度。
eq(double value, double delta)
eq(float value, float delta)
2. aryEq(X[] values) X 可以是boolean,byte,char, double,float,int,long,short,T
這個(gè)是eq(X value)方法的數(shù)組版本,要求比較的兩個(gè)數(shù)組擁有相同的長(zhǎng)度,然后每個(gè)元素都"相同",即都可以滿足eq(X value)方法。
注意到double和float并沒有像eq(X value)方法那樣提供可以設(shè)置精度的重載版本,不知道在數(shù)組比較時(shí)如何去設(shè)置容許精度。
3. gt(X value), lt(X value), X 可以是byte,double,float,int,long,short
這兩個(gè)方法用于參數(shù)的大小匹配,適用于數(shù)值型的基本類型如byte,double,float,int,long,short。
4. geq(X value), leq(X value)
類似gt()和lt(),無(wú)非是將">"改為">=", "<"改為"<="。
5. anyX(), X可以是Boolean, Byte, Char, Double, Float, Int, Long, Short
這是一個(gè)寬松的匹配方法,任何數(shù)值都被視為匹配OK。這個(gè)方法在我們不介意參數(shù)值時(shí)特別有用。
(2) 基于對(duì)象的比較
1. eq(T value)方法
和基本類型類似,不過對(duì)于Object,是通過調(diào)用equals()方法來進(jìn)行比較。
2. same(T value) 方法
和eq()不同,same()是通過比較對(duì)象引用來進(jìn)行比較的。類似java代碼中, a.equals(b)和a == b的差別。
3. anyObject() 和 anyObject(Class<T> clazz)
類似基本類型的any***()方法,非常寬松,在我們不介意參數(shù)值時(shí)使用。
使用方式有三種
(T)EasyMock.anyObject() // 強(qiáng)制類型轉(zhuǎn)換
EasyMock.<T> anyObject() // 固定返回的泛型
EasyMock.anyObject(T.class) // 在參數(shù)中指定返回的泛型
4. isA(Class<T> clazz)
和anyObject(Class<T> clazz) 非常,唯一一個(gè)差別在于當(dāng)輸入?yún)?shù)為null時(shí),anyObject(Class<T> clazz)返回true而isA(Class<T> clazz) 返回false。
(3) 邏輯計(jì)算
easymock支持在參數(shù)匹配時(shí)進(jìn)行一些簡(jiǎn)單的邏輯計(jì)算, 如and(), or (), not()。
not()容易理解,取反而已。or()也容易理解,兩個(gè)匹配方法匹配一個(gè)即可。
但是and()方法我沒能理解,不知道該怎么用,兩個(gè)匹配方法同時(shí)匹配? 有知道的朋友,還望指教。
此外在參數(shù)匹配中,有幾個(gè)特殊角色,享受的待遇與眾不同,easymock為它們提供了專有方法。
1. Comparable
對(duì)于實(shí)現(xiàn)了Comparable接口的對(duì)象,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)
這個(gè)特殊處理非常合理,本來Comparable接口就提供了比較的功能,在參數(shù)匹配時(shí)應(yīng)該容許直接使用。
2. string
由于字符串匹配使用的場(chǎng)景非常多,因此easymock為此也提供了幾個(gè)常見的參數(shù)匹配方法:
contains(String substring)
startsWith(String prefix)
endsWith(String suffix)
find(String regex)
其中contains/startsWith/endsWith是簡(jiǎn)單的字符串查找,而find()則通過支持正則表達(dá)式來提供復(fù)雜匹配。
3. null
對(duì)于Object匹配,很常見的一個(gè)場(chǎng)景就是輸入的參數(shù)為null,easymock中提供isNull() 和 notNull() 兩個(gè)方法來完成對(duì)null值的匹配。
開發(fā)中,經(jīng)常會(huì)遇到下面這種場(chǎng)景,期望輸入的參數(shù)滿足isA()或者容許為null。而直接使用isA(),是不能支持null的,即如果參數(shù)為null時(shí)isA()會(huì)報(bào)不匹配。這個(gè)不是easymock的bug,而是刻意而為,解決的方法是使用 or(isA(...), isNull(...))或者anyObject()。
service.execute((ClassA) EasyMock.or(EasyMock.isA(ClassA.class), EasyMock.isNull()));
service.execute(EasyMock.anyObject(ClassA.class));