兩種不同的模擬方法

2021-10-06 23:32:29 字數 3430 閱讀 1448

無論您選擇採用tdd還是採用更傳統的方法,都將單獨測試類。 這通常意味著您要使用介面進行編碼,並將依賴項注入類中。

去年,我不得不測試乙個servlet。 servlet是展示容器外測試的展示櫃,因為它們依賴於do***()方法中的所述容器。 這些方法中的每乙個都依賴於httpservletrequesthttpservletresponse。 兩者都是在servlet api中沒有具體實現的介面。 因此,基本上,在您的測試中,您會遇到三個選擇:

使用您的容器實現(糟糕!),

建立自己的實現(相當耗時),

使用沒有依賴關係的已有實現。

選擇第三個選項,我發現了這個小小的珠寶mockrunner 。 mockrunner為您提供以下api和框架的模擬實現:

所有這些模擬實現均應按需執行。 例如,如果在測試開始時將物件放入模擬會話中,並且此後仍然處於同一請求中,則可以檢查物件是否仍在此處。 讓我們考慮以下servlet方法進行測試:

您如何使用mockrunner測試此**? 第一件事是從com.mockrunner.servlet.basicservlettestcaseadapter繼承。 **如下:

public

class

mockrunnertest

extends

basicservlettestcaseadapter

/** * test method for

* .*

* @throws ioexception

* @throws servletexception

*/public

void

testdogetadd

()throws

servletexception

,ioexception

/** * test method for

* .*

* @throws ioexception

* @throws servletexception

*/public

void

testdogetremove

()throws

servletexception

,ioexception

/** * test method for

* .*

* @throws ioexception

* @throws servletexception

*/public

void

testdogetreset

()throws

servletexception

,ioexception

}

像這樣測試我們的servlet很好,儘管使用mockrunner有幾個限制:

然後我對mockito產生了興趣。 mockito是乙個「真正的」 mock框架,可增強您的介面,並使用cglib進行分類以提供方法的存根:即,您提供了鏈結到方法呼叫的**。 如今,mockito似乎非常炒作,但趨勢仍在流行。 以下**向您展示了使用mockito製作的測試類:

public

class

mockitotest

});when

(session

.getattribute

(anystring

())).

thenanswer

(new

answer

()});

mockito

.doanswer

(new

answer

()}).

when

(session

).setattribute

(anystring

(),anyobject

());

}/**

* test method for

* .

** @throws ioexception

* @throws servletexception

*/@test

public

void

testdogetadd

()throws

servletexception

,ioexception

/** * test method for

* .

** @throws ioexception

* @throws servletexception

*/@test

public

void

testdogetremove

()throws

servletexception

,ioexception

/** * test method for

* .

** @throws ioexception

* @throws servletexception

*/@test

public

void

testdogetreset

()throws

servletexception

,ioexception

}

mockito嚴重缺乏針對新手的文件。 儘管mockito類有充分的文獻資料,但我認為應該對哲學和體系結構進行外部介紹。 不過,這是我可以解決的許多google code專案的限制。

恕我直言,mockrunner與api整合程度更高,隱藏了實現細節,而對於mockito,您需要了解實現以提供足夠的存根。 mockito的測試類的**大小約為mockrunner的兩倍。 因此,儘管會迫使我使用舊版本的junit,並在沒有此類約束的情況下使用mockito,但我仍將繼續使用mockrunner來使用其整合api的類。

總之,我承認這兩種測試工具都具有截然不同的方法和截然不同的範圍。 我仍然覺得mockito的使用有點複雜。

使自己的想法:

兩種不同的儲存過程呼叫方法

兩種不同的儲存過程呼叫方法 為了突出新方法的優點,首先介紹一下在.net中呼叫儲存過程的 官方 方法。另外,本文的所有示例程式均工作於sqlserver資料庫上,其它情況類似,以後不再一一說明。本文所有例子均採用c 語言。要在應用程式中訪問資料庫,一般性的步驟是 首先宣告乙個資料庫連線sqlconn...

兩種不同的盒模型

邊框 border 外邊距 margin 內邊距 padding 元素的邊框就是圍繞在內容和內邊距的一條或多條線,它的屬性是border 邊框有三個屬性值1.寬度 2.樣式 3.顏色 border width style color 寬度樣式 solid 實線 dashed 虛線 dotted 點狀...

兩種查詢方式的不同

第一種,查詢的 string hql select soft.softid,soft.softname,soft.id from so.supercargo.soft as soft where soft.state in 1,2 ilist list session.find hql 第二種,查詢...