guava集合操作类的使用_使用Guava进行测试集合的实现
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();
}
特征
指定正确的功能很重要。 查看两个枚举CollectionSize
和CollectionFeatures
以查看存在哪些可能性来描述集合的行为。
请注意,创建的测试会同时验证功能! 例如,如果ALLOWS_NULL_VALUES
,构建器将生成测试,以验证向集合添加null会抛出NullPointerException
。
抑制测试
通过在构建器上调用suppressing
,您可以指定将不会运行的测试方法。 当这些功能不足以精确指定行为时,它似乎是最后的选择。 我没有使用它。
设置与拆卸
如果必须在每次测试之前或之后运行代码,则可以将其作为Runnable
分别withTearDown
给withSetUp
或withTearDown
(都可以在构建器上调用)。
可用的测试套件
当然,您也可以为其他接口生成测试套件。 乍一看就产生了以下可能性:
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
guava集合操作类的使用
guava集合操作类的使用_使用Guava进行测试集合的实现相关推荐
- python集合操作班级干部竞选_小学生班级干部竞选稿(精选5篇)
小学生班级干部竞选稿(精选 5 篇) 小学生班级干部竞选稿 1 敬爱的老师,亲爱的同学们: 大家好! 我是一号选手 xx , 我要竞选的职位是班长. 因为班长是 我一直以来的奋斗目标,今天终于有了机会 ...
- Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询
SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...
- set集合判断集合中是否有无元素_集合 (Set) | 一山不容二虎的 Python 数据类型
点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐, 今天 ...
- sqlite工具类 java_Java之泛型、集合工具类
集合工具类 在我们讲完常用的基本集合后,我们就要介绍下位于java.util包下的collections类,注意:我们之前的collection是集合的接口,而collections是一个类.coll ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
- Guava 实用操作集合
guava 是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等. 大家平时经常遇到某些相同的问题,自己写代码也都能解决. ...
- c++怎么将两个类的方法集合成一个类的方法_一文帮你梳理 Java 集合
集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...
- python字典和集合对象可以进行索引操作_建议收藏丨纯知识点:Python基础—字典、集合操作大全...
本文为纯知识点,预计需阅读二十分钟 数据结构基本上就是--它们是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的. 在Python中有四种内建的数据结构--列表.元组和字典,集合. ...
- mysql db模块下载_易语言MySql数据库操作类V1.0模块源码
易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...
最新文章
- 三维视觉惯性SLAM的有效Schmidt-EKF
- 用node.js启动mock.js
- difftime(转)
- 全栈必备Linux 基础
- Acwing第 7 场周赛【未完结】
- ASP.NET-自定义HttpModule与HttpHandler
- 单点登录Redis存储Session及SessionId问题说明与集群实战-3
- SAP concur image download on request
- 投标报价得分计算程序_什么是投标报价?怎么计算呢?
- 删过几十亿个账号,Facebook的人工智能是怎么培养出来的?
- 各种对话框 Dialog
- CURL基于某个URL请求需要身份验证
- 八大流行的微服务架构设计模式探究
- 数据可视化1—蒙特卡罗光线追踪
- 路由器和交换机的原理
- ES集群health为yellow解决办法
- java主类不用public_Java源文件如果含有主类,主类必须是public类
- Kindle Windows版本 中文字体修改工具
- 平面几何中的几个著名定理
- 垃圾键盘(bushi) (悲剧文本)
热门文章
- P2387-[NOI2014]魔法森林【LCT】
- P3891-[GDOI2014]采集资源【背包,dp】
- [XSY4220] 九万步(结论)
- [集训队作业2018] 复读机(生成函数,单位根反演)
- 2017西安交大ACM小学期 敏感词汇[AC自动机]
- 彻底理解正向代理和反向代理
- 通往大神之路,百度Java面试题前200页。
- 用正则判断字符串是否为中文的方法
- vue实现下拉列表远程搜索示例(根据关键词模糊搜索)
- asp.net中条件查询+分页