guava集合操作类的使用_使用Guava进行测试集合的实现
guava集合操作類的使用
我目前正在為LibFX添加一項(xiàng)新功能,為此我創(chuàng)建了一些類似于Java Collections Framework的自定義集合。 我一直在尋找可以與之對(duì)抗的測試,并很高興發(fā)現(xiàn)Google的Guava包含了我所需要的:一個(gè)龐大的測試套件,可以驗(yàn)證JDK和Guava的所有集合接口實(shí)現(xiàn)的每個(gè)細(xì)節(jié)。
讓我們快速瀏覽一下。
總覽
這篇文章將首先展示如何設(shè)置項(xiàng)目,然后再著手進(jìn)行實(shí)際測試。
我沒有創(chuàng)建專門的示例,但是您可以看到我如何在LibFX中使用它 。
建立
為此,我們需要JUnit,Guava-Testlib和一些樣板代碼。
獲取JUnit
如果您尚未在項(xiàng)目中使用JUnit,請(qǐng)?jiān)诖颂帿@取。 如果您使用Maven或Gradle:
Maven的依賴項(xiàng)信息
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope> </dependency>Gradle的依賴項(xiàng)信息
testCompile 'junit:junit:4.12'獲取番石榴
我們實(shí)際上需要的不是Guava本身,而是Guava-Testlib 。 您可以從中央存儲(chǔ)庫下載它, 該存儲(chǔ)庫還包含不同管理者的依賴項(xiàng)信息。
為了您的方便:
Maven的依賴項(xiàng)信息
<dependency><groupId>com.google.guava</groupId><artifactId>guava-testlib</artifactId><version>18.0</version><scope>test</scope> </dependency>Gradle的依賴項(xiàng)信息
testCompile 'com.google.guava:guava-testlib:18.0'寫一些樣板
假設(shè)您要編寫一個(gè)MySet和相應(yīng)的MySetTest 。
通過JUnit-3.8.x方式,創(chuàng)建一個(gè)方法public static Test suite();. JUnit查找此方法,并使用它來識(shí)別將為該類運(yùn)行的所有測試。 在該方法內(nèi),創(chuàng)建一個(gè)TestSuite并添加我們將進(jìn)一步編寫的測試:
MySetTest中的樣板
public class MySetTest {public static Test suite() {return new MySetTest().allTests();}public Test allTests() {TestSuite suite =new TestSuite("package.name.of.MySetTest");suite.addTest(testForOneToWayUseMySet());suite.addTest(testForAnotherWayToUseMySet());return suite;}}(我沒有嘗試使用JUnit 4的注釋來執(zhí)行此操作。如果您這樣做了,請(qǐng)ping通,然后將其包含在此處。)
放置好樣板后,您可以使用JUnit運(yùn)行此類,例如從IDE內(nèi)部或CI服務(wù)器上運(yùn)行此類。
測試您的實(shí)施
現(xiàn)在已經(jīng)完成了,我們可以開始為實(shí)現(xiàn)實(shí)際創(chuàng)建測試了。 或者,更準(zhǔn)確地說,告訴番石榴如何為我們做到這一點(diǎn)。 這是一個(gè)分為兩部分的過程:一個(gè)為集合中的元素和被測單元?jiǎng)?chuàng)建一個(gè)生成器,另一個(gè)使用Guava的測試套件構(gòu)建器中的一個(gè)來創(chuàng)建針對(duì)實(shí)現(xiàn)而定制的全面測試集。
我們將繼續(xù)測試Set的實(shí)現(xiàn)。 在下面,我們將查看哪些其他接口測試套件可用。
元素生成器和被測單元
測試套件構(gòu)建器要求您允許在集合中創(chuàng)建樣本元素并實(shí)例化集合。 為此,您必須實(shí)現(xiàn)TestSetGenerator<E> (其中E是元素的類型)。
這很簡單, order(List<E>)是可能需要考慮的唯一方法。 請(qǐng)注意,與文檔相反,即使未報(bào)告CollectionFeature.KNOWN_ORDER ,testlib(18.0)的當(dāng)前版本也確實(shí)調(diào)用了此方法(有關(guān)功能的詳細(xì)信息,請(qǐng)參見下文)。 在我的情況下 ,只需返回插入順序即可。
測試套件生成器
現(xiàn)在,這才是真正的魔術(shù)發(fā)生。 您從上方獲取生成器,將其傳遞給正確的測試套件生成器,指定您的集合具有哪些功能,它將創(chuàng)建定制的全面測試套件:
使用“ SetTestSuiteBuilder”創(chuàng)建測試
public Test testForOneToWayUseMySet() {return SetTestSuiteBuilder.using(new MySetGenerator()).named("one way to use MySet").withFeatures(CollectionSize.ANY,CollectionFeature.ALLOWS_NULL_VALUES,CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION,CollectionFeature.SUPPORTS_ADD,CollectionFeature.SUPPORTS_ITERATOR_REMOVE,CollectionFeature.SUPPORTS_REMOVE,).createTestSuite(); }特征
指定正確的功能很重要。 查看兩個(gè)枚舉CollectionSize和CollectionFeatures以查看存在哪些可能性來描述集合的行為。
請(qǐng)注意,創(chuàng)建的測試會(huì)同時(shí)驗(yàn)證功能! 例如,如果ALLOWS_NULL_VALUES ,構(gòu)建器將生成測試,以驗(yàn)證向集合添加null會(huì)拋出NullPointerException 。
抑制測試
通過在構(gòu)建器上調(diào)用suppressing ,您可以指定將不會(huì)運(yùn)行的測試方法。 當(dāng)這些功能不足以精確指定行為時(shí),它似乎是最后的選擇。 我沒有使用它。
設(shè)置與拆卸
如果必須在每次測試之前或之后運(yùn)行代碼,則可以將其作為Runnable分別withTearDown給withSetUp或withTearDown (都可以在構(gòu)建器上調(diào)用)。
可用的測試套件
當(dāng)然,您也可以為其他接口生成測試套件。 乍一看就產(chǎn)生了以下可能性:
Java的集合:
- 采集
- 迭代器
- 清單
- 地圖
- 導(dǎo)航地圖
- 導(dǎo)航集
- 隊(duì)列
- 組
- SortedMap
- SortedSet
番石榴的收藏:
- 雙圖
- ListMultimap
- 多圖
- 多集
- SetMultimap
- SortedMultiset
- SortedSetMultimap
對(duì)* TestSuiteBuilder進(jìn)行類型搜索(請(qǐng)注意通配符)會(huì)產(chǎn)生一些其他生成器。 我沒有對(duì)其進(jìn)行調(diào)查,但是有可能將其用于其他情況下的測試。
為了使用它們,只需實(shí)現(xiàn)相應(yīng)的Test...Generator并將其交給相應(yīng)的...TestSuiteBuilder 。
反射
我們已經(jīng)看到了如何使用Guava的Testlib測試集合的實(shí)現(xiàn):如何將其和JUnit包含在我們的項(xiàng)目中,運(yùn)行它所需的樣板以及對(duì)生成器和測試套件生成器的概述。 后者是發(fā)生所有魔術(shù)的地方,它可以創(chuàng)建全面的測試,以適合我們對(duì)實(shí)現(xiàn)及其功能的描述。
翻譯自: https://www.javacodegeeks.com/2015/03/test-collection-implementations-with-guava.html
guava集合操作類的使用
總結(jié)
以上是生活随笔為你收集整理的guava集合操作类的使用_使用Guava进行测试集合的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb实验报告_Dropwiza
- 下一篇: fx 线程 弹窗_JFXPanel和FX