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

guava集合操作类的使用

guava集合操作类的使用_使用Guava进行测试集合的实现相关推荐

  1. python集合操作班级干部竞选_小学生班级干部竞选稿(精选5篇)

    小学生班级干部竞选稿(精选 5 篇) 小学生班级干部竞选稿 1 敬爱的老师,亲爱的同学们: 大家好! 我是一号选手 xx , 我要竞选的职位是班长. 因为班长是 我一直以来的奋斗目标,今天终于有了机会 ...

  2. Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询

    SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...

  3. set集合判断集合中是否有无元素_集合 (Set) | 一山不容二虎的 Python 数据类型

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐, 今天 ...

  4. sqlite工具类 java_Java之泛型、集合工具类

    集合工具类 在我们讲完常用的基本集合后,我们就要介绍下位于java.util包下的collections类,注意:我们之前的collection是集合的接口,而collections是一个类.coll ...

  5. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  6. Guava 实用操作集合

    guava 是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.         大家平时经常遇到某些相同的问题,自己写代码也都能解决. ...

  7. c++怎么将两个类的方法集合成一个类的方法_一文帮你梳理 Java 集合

    集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...

  8. python字典和集合对象可以进行索引操作_建议收藏丨纯知识点:Python基础—字典、集合操作大全...

    本文为纯知识点,预计需阅读二十分钟 数据结构基本上就是--它们是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的. 在Python中有四种内建的数据结构--列表.元组和字典,集合. ...

  9. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

最新文章

  1. 三维视觉惯性SLAM的有效Schmidt-EKF
  2. 用node.js启动mock.js
  3. difftime(转)
  4. 全栈必备Linux 基础
  5. Acwing第 7 场周赛【未完结】
  6. ASP.NET-自定义HttpModule与HttpHandler
  7. 单点登录Redis存储Session及SessionId问题说明与集群实战-3
  8. SAP concur image download on request
  9. 投标报价得分计算程序_什么是投标报价?怎么计算呢?
  10. 删过几十亿个账号,Facebook的人工智能是怎么培养出来的?
  11. 各种对话框 Dialog
  12. CURL基于某个URL请求需要身份验证
  13. 八大流行的微服务架构设计模式探究
  14. 数据可视化1—蒙特卡罗光线追踪
  15. 路由器和交换机的原理
  16. ES集群health为yellow解决办法
  17. java主类不用public_Java源文件如果含有主类,主类必须是public类
  18. Kindle Windows版本 中文字体修改工具
  19. 平面几何中的几个著名定理
  20. 垃圾键盘(bushi) (悲剧文本)

热门文章

  1. P2387-[NOI2014]魔法森林【LCT】
  2. P3891-[GDOI2014]采集资源【背包,dp】
  3. [XSY4220] 九万步(结论)
  4. [集训队作业2018] 复读机(生成函数,单位根反演)
  5. 2017西安交大ACM小学期 敏感词汇[AC自动机]
  6. 彻底理解正向代理和反向代理
  7. 通往大神之路,百度Java面试题前200页。
  8. 用正则判断字符串是否为中文的方法
  9. vue实现下拉列表远程搜索示例(根据关键词模糊搜索)
  10. asp.net中条件查询+分页