Guava的测试集合实现

我目前正在为LibFX添加一个新功能,为此我创建了一些类似于Java Collections Framework的自定义集合。 我一直在寻找可以针对它们进行测试的测试,并很高兴发现Google的Guava包含了我所需要的:一个庞大的测试套件,它针对JDK和Guava的所有集合接口验证了我实现的每个细节。

让我们快速浏览一下。

总览

这篇文章将首先展示如何设置项目,然后再着手进行实际测试。

我没有创建专门的示例,但是您可以看到我如何在LibFX中使用它 。

设定

为此,我们需要JUnit,Guava-Testlib和一些样板代码。

获取JUnit

如果您尚未在项目中使用JUnit,请在此处获取。 如果您使用Maven或Gradle:

Maven的依赖项信息

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

Gradle的依赖项信息

testCompile 'junit:junit:4.12'

获取番石榴

我们实际上需要的不是Guava本身,而是Guava-Testlib 。 您可以从中央存储库下载它, 该存储库还包含不同管理者的依赖项信息。

为了您的方便:

Maven的依赖项信息

<dependency><groupId>com.google.guava</groupId><artifactId>guava-testlib</artifactId><version>18.0</version><scope>test</scope>
</dependency>

Gradle的依赖项信息

testCompile 'com.google.guava:guava-testlib:18.0'

写一些样板

假设您要编写一个MySet和相应的MySetTest

通过JUnit-3.8.x方式,创建一个方法public static Test suite();. JUnit查找此方法,并使用它来识别将为该类运行的所有测试。 在该方法内,创建一个TestSuite并添加我们将要进一步编写的测试:

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的注释来执行此操作。如果您这样做了,请ping通,然后将其包含在此处。)

放置好样板后,您可以使用JUnit运行此类,例如,从IDE内部或CI服务器上运行。

测试您的实施

至此,我们可以开始为实现实际创建测试了。 或者,更准确地说,告诉番石榴如何为我们做到这一点。 这是一个分为两部分的过程:一个为集合中的元素和被测单元创建一个生成器,另一个使用Guava的测试套件构建器之一来创建针对实现量身定制的全面测试集。

我们将继续测试Set的实现。 在下面,我们将看到可用的其他接口测试套件。

元素生成器和被测单元

测试套件生成器要求您允许在集合中创建样本元素并实例化集合。 为此,您必须实现TestSetGenerator<E> (其中E是元素的类型)。

这很简单, order(List<E>)是可能需要考虑的唯一方法。 请注意,与文档相反,即使未报告CollectionFeature.KNOWN_ORDER ,testlib(18.0)的当前版本也确实调用了此方法(有关功能的详细信息,请参见下文)。 就我而言 ,返回插入顺序就足够了。

测试套件生成器

现在,这才是真正的魔术发生。 您从上方获取生成器,将其传递给正确的测试套件生成器,指定您的集合具有哪些功能,它将创建定制的全面测试套件:

使用“ SetTestSuiteBuilder”创建测试

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();
}

特征

指定正确的功能很重要。 查看两个枚举CollectionSizeCollectionFeatures以查看存在哪些可能性来描述您的集合的行为。

请注意,创建的测试会同时验证功能! 例如,如果ALLOWS_NULL_VALUES ,构建器将生成测试,以验证向集合添加null会抛出NullPointerException

抑制测试

通过在构建器上调用suppressing ,可以指定将不会运行的测试方法。 当这些功能不足以精确指定行为时,它似乎是最后的手段。 我没有使用它。

设置与拆卸

如果您必须在每次测试之前或之后运行代码,则可以将其作为Runnable分别withTearDownwithSetUpwithTearDown (都可以在构建器上调用)。

可用的测试套件

当然,您也可以为其他接口生成测试套件。 乍一看就产生了以下可能性:

Java的集合:

  • 采集
  • 迭代器
  • 清单
  • 地图
  • 导航地图
  • 导航集
  • 队列
  • SortedMap
  • SortedSet

番石榴的收藏:

  • 双图
  • ListMultimap
  • 多图
  • 多集
  • SetMultimap
  • SortedMultiset
  • SortedSetMultimap

* TestSuiteBuilder (注意通配符)进行类型搜索会生成一些其他生成器。 我没有调查它们,但是有可能将其用于其他情况下的测试。

为了使用它们,只需实现相应的Test...Generator并将其交给相应的...TestSuiteBuilder

反射

我们已经看到了如何使用Guava的Testlib测试集合的实现:如何将其和JUnit包含在我们的项目中,运行它所需的样板以及对生成器和测试套件生成器的概述。 后者是发生所有魔术的地方,它可以创建全面的测试,以适合我们对实现及其功能的描述。

翻译自: https://www.javacodegeeks.com/2015/03/test-collection-implementations-with-guava.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSDT – Error SQL70001 This statement is not recognized in this context-摘自网络

March 28, 2013 — arcanecode One of the most common errors I get asked about when using SQL Server Data Tools (SSDT) Database Projects is the error “This statement is not recognized in this context”. This is actually a pretty simple error to fix. Envisi…

linux wget 图片,15个Linux Wget下载实例终极指南

9、使用wget -i下载多个文件首先&#xff0c;保存一份下载链接文件cat>filelist.txt url1 url2 url3 url4接着使用这个文件和参数-i下载wget -i filelist.txt10、使用wget --mirror镜像网站下面的例子是下载整个网站到本地。wget --mirror -p --convert-links -P ./LOCAL UR…

带有JAX-RS和PrimeFaces的RESTful图表

通常&#xff0c;利用图表提供数据的可视表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果将PrimeFaces图表组件与RESTful Web服务数据结合使用&#xff0c;我们可以创建自定义图表&#xff0c;以适合桌面和移…

UVAlive 6131 dp+斜率优化

这道题和06年论文《从一类单调性问题看算法的优化》第一道例题很相似。 题意&#xff1a;给出n个矿的重量和位置&#xff0c;这些矿石只能从上往下运送&#xff0c;现在要在这些地方建造m个heap&#xff0c;要使得&#xff0c;sigma距离*重量最小。 思路&#xff1a;O(n ^ 3)的…

c语言错误重定义,C语言的重定义错误求解

追问那如果要用到全局变量&#xff0c;要把它写在C文件中&#xff1f;那全局变量的主要作用其实就是跨文件作用域来传递一些东西&#xff0c;写在C文件中&#xff0c;不太好在别的文件中引用吧。用的时候写extern进去&#xff1f;感觉全局变量在C里用起来比较麻烦&#xff0c…

Netty:另一种Web(套接字)服务器

如今&#xff0c; Netty已用于Internet上的各种应用程序中&#xff0c;以处理数千&#xff08;即使不是数百万&#xff09;的聊天对话&#xff0c;包括Minecraft &#xff0c; Twitter和许多其他应用程序在内的多人游戏。 但是&#xff0c;它并没有在开发企业应用程序的企业程序…

arm opcode hook

/**************************************/* 作者:半斤八兩/* 博客:http://cnblogs.com/bjblcracked/* 日期:2013-09-05 11:11/**************************************只是感兴趣&#xff0c;没有其他目的。失误之处敬请诸位大侠赐教!因工作需要,最近一直在研究arm.看到论坛也…

c语言程序整数四则运算,c语言中三个整数随机的四则运算

满意答案hors10722014.01.06采纳率&#xff1a;58% 等级&#xff1a;12已帮助&#xff1a;18274人#include #include #include #define N 10 //随机出10道题目int main(){int num1, num2, num3, count0, result,resultTrue,flag;//result:用户输入结果 resultTrue:正确结果 …

带有调试器的Apache Camel Eclipse工具

大约2个月前&#xff0c; Lars Heineman在 JBoss工具堆栈中的博客中介绍了改进的Apache Camel Eclipse工具。 在即将发布的版本中&#xff0c;他们将Camel调试器与本机Eclipse调试器集成在一起&#xff0c;因此当您使用断点时&#xff0c;您将获得Eclipse调试体验&#xff0c;…

马秀丽C语言程序设计答案pdf,C语言程序设计清华大学马秀丽刘志妩科后习题9答案.doc...

C语言程序设计清华大学马秀丽刘志妩科后习题9答案习 题 9二 编程题main(){int n,*a,i,j,t0;scanf("%d",&n);for(i0;ifor(j0;jscanf("%d",ai*nj);for(i0;ifor(j0;jif (*(ai*nj)!0) t1;if (t0) printf("is xia san jiao fang zhen");else prin…

从Gradle自动将工件提升到Maven Central

快速教程&#xff0c;无需在带有Gradle Nexus Staging插件的Nexus GUI中单击即可将Gradle项目中的工件提升/发布到Maven Central。 介绍 Maven Central &#xff08;又名“中央存储库”&#xff09;&#xff08;可能&#xff09;是世界上最大的一组开源工件&#xff0c;这些工…

c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

往往&#xff0c;我们一提到指针函数和函数指针的时候&#xff0c;就有很多人弄不懂。下面就由小编详细为大家介绍C语言中函数指针&#xff0c;指针函数和函数指针之间的区别。c语言指针函数定义&#xff1a;函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变…

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

java DOM4J 读取XML

最近学习Java&#xff0c;在处理XML文档的时候&#xff0c;查阅相关资料&#xff0c;发现了DOM4J这个jre库&#xff0c;相对C#的XML处理来说&#xff0c;功能还算是跟得上 下面展示一篇我自己写的一个XML读取测试 import java.util.Iterator; import java.io.BufferedReader; i…

c语言如何实现不定参数,C语言中不定参数的实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼但是请注意,由於 K&R C 中并不检查参数型态&#xff0c;so 在此是用 ANSIC 来说明&#xff0c;毕竟 ANSI C 是目前所有 C Compiler 都支援的标准&#xff1b;常在网路上看到有人推荐 K&R The C Programming Language 这本书…

SX-BOX试用笔记

1.今天开始试用SX-BOX&#xff0c;我将用它来做自己平时的开发和文档的工作&#xff0c;因为我的职责是一个程序员。 1.屏幕如果支持更大的也清晰的话&#xff0c;我会感觉很舒服。 2.USB设备插入还无法识别。。。 3.现在开始安装开发工具&#xff0c;目前我打算在上面安装Adob…

c语言成绩转换绩点,如何将平时成绩转化为GPA成绩?

新东方留学生资料下载姓名手机号短信验证码图片验证码年级请选择5年级6年级7年级8年级9年级高一高二高三高三复习大一大二大三大四大五研一研二研三博一博二在职课程请选择雅思托福GREGMATSAT其他行政区请选择请选择请选择{"name":{"label":"姓名&quo…

Hibernate查询缓存如何工作

介绍 既然我已经介绍了实体和集合缓存&#xff0c;现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关&#xff0c;它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样&#xff0c;查询缓存也不像人们想象的那么琐碎。 实体模型 对于我…

Javascript学习笔记1 数论

1.Javascript不用担心内存的回收与对象的销毁&#xff01; 2.Javascript有&#xff1a;infinity、NaN全局变量表示 被0整除的无穷 和 非数字。undefined和null表示 未定义 和 空&#xff0c;undefined和null可以互换&#xff0c;判别二者需用 全等 号&#xff08;不光判断值&…

C语言bcd码减法过程,bcd码的减法运算规则举例.ppt

bcd码的减法运算规则举例第1章&#xff1a;微型计算机基础 本章基本要求&#xff1a; ⑴ 单片微型计算机的含义 ⑵ 各系列单片机的特点 ⑶ 51系列单片机的概念及指标(重点) ⑷ 单片微机工业产品概念 第1章&#xff1a;微型计算机基础 电子计算机是一种能对信息进行加工处理的机…