【原创】如何使用Jmockit进行单元测试
如何使用jmockit進(jìn)行單元測(cè)試
?
?
1. Jmockit簡(jiǎn)介
JMockit 是用以幫助開發(fā)人員編寫測(cè)試程序的一組工具和API,它完全基于 Java 5 SE 的?java.lang.instrument 包開發(fā),內(nèi)部使用 ASM 庫(kù)來修改Java的Bytecode。正是由于基于instrument,可以修改字節(jié)碼。所以這也是它強(qiáng)大的原因。
Jmockit可以mock的種類包含了:
1. class(abstract, final, static)
2. interface
3. enum
4. annotation
5. native
Jmockit 有兩種mock的方式:
1. Behavior-oriented(Expectations & Verifications)
2. State-oriented(MockUp<GenericType>)?
通俗點(diǎn)講,Behavior-oriented是基于行為的mock,對(duì)mock目標(biāo)代碼的行為進(jìn)行模仿,更像黑盒測(cè)試。State-oriented 是基于狀態(tài)的mock,是站在目標(biāo)測(cè)試代碼內(nèi)部的。可以對(duì)傳入的參數(shù)進(jìn)行檢查、匹配,才返回某些結(jié)果,類似白盒。而State-oriented的 new MockUp基本上可以mock任何代碼或邏輯。非常強(qiáng)大。
(這段介紹來自網(wǎng)絡(luò)轉(zhuǎn)載)
?
?
?
2. Jmockit實(shí)踐
使用jMockit首先要引用相關(guān)的jar包,pom文件引用如下.
| <dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit</artifactId> <version>1.20</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit-coverage</artifactId> <version>1.20</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>? |
?
?
2.1 示例1:模擬類
被測(cè)試方法如下:
其中NegativeTransDos的insert方法是插入數(shù)據(jù)庫(kù)。
為了測(cè)試process()方法的邏輯,希望能夠模擬dao.insert方法的返回結(jié)果,參考測(cè)試代碼如下:
可以看到使用jmockit基本有三個(gè)步驟:
(1)打樁。指定要打樁類和函數(shù),模擬返回結(jié)果。這里是new Mockup(NegativeTransDos)。
(2)調(diào)用被測(cè)方法。被測(cè)邏輯執(zhí)行過程中,之前的打樁數(shù)據(jù)生效。
(3)判斷測(cè)試結(jié)果是否符合預(yù)期。
通過以下方法來模擬類和方法。
| new Mockup(類) { 模擬方法{ ? ? ? ? ? 控制該方法返回結(jié)果 } } |
?
2.2 示例2:模擬靜態(tài)方法
?被測(cè)試方法如下。其中紅框是需要Mock的兩個(gè)靜態(tài)方法。通過Jmockit模擬這兩個(gè)靜態(tài)方法的返回,只關(guān)注EdaStartup方法的自身邏輯。
參考測(cè)試代碼如下:
?
?
2.3 示例3:模擬非靜態(tài)方法
被測(cè)試方法:
這里包括兩種方法的模擬:
McEventManager.getReceiver(),這個(gè)是靜態(tài)方法調(diào)用的模擬,參考2.1章節(jié)。
receiver.getEvent(),這個(gè)是普通對(duì)象方法調(diào)用。本節(jié)關(guān)注這種方法的模擬。
?
參考測(cè)試代碼如下:
首先需要通過 @Injectable 聲明要插樁的對(duì)象:
private McEventReceiver receiver;
之后使用以下方式來插樁:
| new NonStrictExpectations() { ? ? 要模擬的方法(參數(shù)1,參數(shù)2,…) ? ? result = 返回結(jié)果 } |
Jmockit提供了很彪悍的萬能入?yún)?#xff0c;這一點(diǎn)非常方便。包括:
?
?
2.4 示例4:模擬private靜態(tài)方法
被測(cè)代碼如下:
publicMethod()是被測(cè)試方法,其中調(diào)用了靜態(tài)成員方法privateMethod。為了摒除privateMethod的影響,需要模擬它的返回結(jié)果。
參考測(cè)試代碼如下:
?
test1和test2的輸出結(jié)果分別是:
?
2.5 示例5:模擬private非靜態(tài)方法
被測(cè)代碼如下:
publicMethod()是被測(cè)試方法,其中調(diào)用了私有非靜態(tài)成員方法privateMethod。為了摒除privateMethod的影響,需要模擬它的返回結(jié)果。
參考測(cè)試代碼如下:
對(duì)比2.5私有靜態(tài)方法的模擬可以看到略有區(qū)別。
new Expectations(XXX) 中,之前指定的是MockClass.class,這里指定的是被測(cè)試的MockClass對(duì)象。
test1和test2的輸出結(jié)果分別是:
?
2.6 示例6:模擬private非靜態(tài)成員變量
被測(cè)方法如下:
其中field是MockField的私有變量。我們目的是能夠模擬該私有變量的值,來關(guān)注publicMethod方法的測(cè)試。
參考測(cè)試代碼如下:
test1和test2的輸出結(jié)果分別是:
?
2.7 示例7:模擬private靜態(tài)成員變量
類似2.6節(jié)非靜態(tài)成員變量的模擬,參考2.4和2.5的區(qū)別。示例略。
?
轉(zhuǎn)載于:https://www.cnblogs.com/simplestupid/p/5170220.html
總結(jié)
以上是生活随笔為你收集整理的【原创】如何使用Jmockit进行单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: exsi主机之间使用scp拷贝文件超时问
- 下一篇: php 分页查询