hamcrest

我在Hamcrest库上做了几篇文章 ,我确实很喜欢使用它,但是我希望对其进行一些更改。 我了解他们所做的大多数设计决策,但我认为其中一些确实不值得。

介绍Litecrest

我对库所做的大多数更改都有助于减轻Hamcrest的负担,因为我觉得有些事情不必要地减轻了负担。 这就是为什么我将更改称为Litecrest。 它不会是一个实际的库; 这只是大声思考。 我也希望您能从中学到一些有关设计库的知识。

没有说明

Description接口以及StringDescriptionBaseDescription类实际上并不值得。 他们提供了列表转换为字符串好看一些不错的方法,但toString()在所有这些方法应该是足够的。 如果不是这样,可以将一些protected final方法放在BaseMatcher ,以方便地为列表构建字符串。 当然,这并没有真正遵循SRP密切,所以你可以使用类似 Description ,以提供方便的方法。

说明,否则不是很有帮助。 它的存在性假设它专门用于提供从长远来看可能不是String的输出。 作为一个使用良好的库,将其从String更改为与输出无关的类型会破坏向后兼容,但这种更改不太可能需要。 应用YAGNI , Description类就在厕所下面。

无输出参数

所述describeTo()describeMismatch 不宜服用在Description或附加物体的任何其它类型的字符串,尤其是作为out参数(某物,以避免尽可能经常)。 既然这些方法没有开始的返回类型,那么绝对没有理由使用out参数。

仔细研究问题,您将发现根本没有理由使用参数。 我了解到,他们可能一直在试图迫使匹配器的创建者不使用String串联,但事实并非如此。 如果匹配器的描述只是一个简单的小字符串,则没有理由他们不应该仅仅返回该字符串。 就个人而言,我将删除Description参数,并为它们提供String或CharSequence的返回类型。 我考虑使用CharSequence因为那样会给使用StringBuilder带来更大的动力,但是简单地返回String也不是什么大问题,因为他们可以在其上调用toString() 。 不过,我也可能会使用CharSequence ,因为我将在断言逻辑中使用StringBuilder来将输出放在一起,并且StringBuilder也可以接受CharSequence ,因此唯一的toString()必须在完成输出时被调用。

类型安全

Matcher接口采用通用参数,该参数与matches()方法一起使用,但是所述方法采用Object而不是通用类型。 javadoc声称这是由于类型擦除引起的,但我不认为这是一个问题。 我没有做任何挖掘来尝试是否可以将其切换为通用类型,但是如果我发现您实际上可以使用通用类型,则可以。 这消除了对TypeSafeMatcher的需要,因为它也检查null,因此可以用更简单的NullCheckingMatcher代替,或者仅实现它,以便断言在捕获到NullPointerException将不匹配描述更改为“为null”。 通过执行所有这些操作,我们可以消除所有其他双倍的基类,这些基类必须加倍以覆盖类型安全匹配器和不那么重要的匹配器。 (例如: CustomMatcherCustomTypeSafeMatcherDiagnosingMatcherTypeSafeDiagnosingMatcher ,以及我加倍的ChainableMatcher ,摆脱了两个DiagnosingMatcher的影响;它们的设计很差,两次调用matches()

更改一些名字

我真的不喜欢describeTo()这个名字。 应该是describeExpected()describeMatch() 。 我了解他们遵循JMock ConstraintsSelfDescribing的命名约定,但是看到他们没有费心完成其余方法签名的复制,实际上并没有任何SelfDescribing

CustomMatcher S的关系被称为OneOffMatcher S或QuickMatcher秒。 Custom是一个令人误解的名称,听起来您需要对其进行扩展才能创建自己的匹配器。

文档中的更多示例

我不确定该库中有几类有用,因为它们的文档未显示其用法。 Condition就是其中之一。 从少量的文档看来,这似乎是相对有用的,但是由于它没有提供使用示例(并且它是一个具有内部接口和两个内部类的相对复杂的文件),我不知道如何使用它。 它还没有记录其公共方法,因此我不确定它们是否需要大量研究。

FeatureMatcher已有不错的文档,但是同样,没有示例。

那些为图书馆编写文档的人在任何时候都牢记这一点; 如果不是很明显(通常,即使不是很明显),则应给出使用中的类的示例。

删除无关的类

其中一些已经被直接或间接地解决了。 删除Description及其所有子类。 删除SelfDescribing ,因为它仅在Description仍然存在时才真正有用。 删除所有TypeSafe版本的基本匹配器。 卸下Diagnosing匹配器。 我不确定是否应该删除Condition因为我没有太大用。 如果保留Condition ,那么最终在核心org.hamcrest包中有五个原始的十一个类,在api org.hamcrest包中有四个原始的两个接口。

现在,让我们深入研究org.hamcrest.internal包。 ArrayIterator没什么用,因为您只能使用可以与foreach循环一起使用的数组。 NullSafety似乎模仿Arrays.toList()功能,但是用IsNull匹配器替换了null匹配器。 我看不到这有什么帮助,因此将其删除。 ReflectiveTypeFinder可能最终会有用。 我只看到它在TypeSafeMatcherFeatureMatcher ,尽管我不确定在FeatureMatcher使用了多少。 不过,我会保留。 最后两个处理的是SelfDescribing ,我们已将其删除,因此这两个处理也是一样。 这仅使ReflectiveTypeFinder脱离了以前的五个类。

我不打算讨论所有其他匹配器。 在大多数情况下,已添加它们的用途。 由于删除了这么多的基类,几乎所有的类都可能必须进行更改。

Lambdas!

如果将新的功能范例也应用到hamcrest,则可以扩展匹配器概念的实用性。 我没有想太多,但是对于一次性匹配器,您可以修改库以包括一个新的assertThat()方法,如下所示:

public static  void assertThat(T item, String description, Predicate matcher) {if(!matcher.test(item)) {StringBuilder output = new StringBuilder();output.append("Expected: ").append(description).append("\n      but: was").append(item.toString());throw new AssertionError(output.toString());}
}

这将使您可以编写类似于以下内容的断言:

assertThat("cats", "doesn't contain \"dogs\"", str -> !str.contains("dogs"));

实际上,实际上我已经在ez-testing迷你库中添加了LambdaAssert类,因此您可以将其与原始的hamcrest库一起使用。

匹配器接口

实际上有一个Matcher接口是毫无意义的,因为hamcrest希望您扩展BaseMatcher而不是实现Matcher 。 如果您非常不想让任何人实现,那么为什么要创建一个接口? 特别是因为BaseMatcher为我们所做的唯一事情就是为describeMismatch()创建一个默认实现describeMismatch()并“实现”放置在此处的不赞成使用的方法,告诉您使用BaseMatcher而不是Matcher )。

如果您真的不希望人们使用该界面,请摆脱它。 就我个人而言,由于无论如何我总是会重写describeMismatch() ,因此我认为只实现接口就完全可以了,而不必让JVM加载实际上为我提供任何东西的基类。

另外,由于我们现在有了Java 8,所以该接口可以只使用默认方法来实现默认实现。 我知道可以避免这种情况,因为较旧的Java版本将无法利用这一点。

所以,要么只是BaseMatcher或没事的Matcher正在实施。

奥托罗

我还想更改其他一些小事情,例如,迫使人们重写describeMismatch()而不是提供默认值,但是我甚至不确定那个,因为默认值通常足够有效。 无论如何,即使您有一个受欢迎的图书馆,也并不意味着它是完美的。 始终注意进行重构。

不幸的是,所有这些更改都不是向后兼容的,但有时是值得的。

翻译自: https://www.javacodegeeks.com/2015/01/redesigning-hamcrest.html

hamcrest

hamcrest_重新设计Hamcrest相关推荐

  1. 重新设计Hamcrest

    我在Hamcrest库上做了几篇文章 ,我确实很喜欢使用它,但是我希望对其进行一些更改. 我了解他们做出的大多数设计决策,但我认为其中一些确实不值得. 介绍Litecrest 我对库所做的大多数更改都 ...

  2. junit集成Hamcrest测试集合中某个属性是否包含特定值

    junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...

  3. junit、hamcrest、eclemma的安装与使用

    1.junit的安装与使用 1.1 安装步骤 1)从http://www.junit.org/ 下载junit相应的jar包: 2) 在CLASSPATH中加入JAR包所在的路径,如E:\Java\j ...

  4. 软件测试实验——安装并使用junit、hamcrest和eclemma进行简单测试

    一.安装junit.hamcrest和eclemma 首先,到junit官网下载junit和hamcrest. 新建java项目 完整代码已经上传至github:flyzero的coding路 实验内 ...

  5. NLM 公布了一个新的重新设计的 PubMed 数据库

    经常使用 PubMed 的童鞋可能已经发现,美国国家医学图书馆(NLM)在今年 10 月份左右发布了一个新的重新设计的版本以取代 PubMed 数据库的现有版本,新版本现在已经上线,可以通过下面的链接 ...

  6. 基于Python语言Hamcrest断言的使用

    我们通常熟悉的断言是assert()系列的断言,但有的时候也不能满足我们的需求,所以有了更强大的断言Hamcrest. 一.Hamcrest简介 Hamcrest源于Java,支持多种语言,是用于编写 ...

  7. JUnit注解与hamcrest

    2019独角兽企业重金招聘Python工程师标准>>> 黑盒测试: 黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用.在测试中,把程序看作一个不能打开的黑盒子,在完全 ...

  8. Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用?

    点击关注,赶紧上车 前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整.那么今天就要详细说说这个重新设计的配置内容, ...

  9. #架构#重新设计socks5代理代码框架

    之前写过socks5代理,具体请看这篇文章. 在写任何代码代码之前,一直认为只有设计好了相应的数据结构,才能写好好的算法和框架.从前面的代码来看,对socks5协议的数据结构定义还算不错,具有很好的可 ...

最新文章

  1. 【Redis】3. Redis数据类型 Hash
  2. vue里写三元判断绑定class和style
  3. Solaris11 磁盘分区
  4. 7-23 哥尼斯堡的“七桥问题”(25 分)
  5. 【论文解读】EMNLP2019-多粒度自注意力机制
  6. Ubuntu下Postfix邮件服务器安装及基本的设置
  7. fastDFS安装用到命令
  8. 如何使用bat批处理命令打开WSL
  9. 中国石油大学《马克思主义基本原理》第三阶段在线作业
  10. crontab定时执行任务命令详解及crontab 误删除恢复
  11. Oracle 重建TEMP表空间
  12. 什么是CSTC价值协议
  13. VB编程:DoWhile...Loop当循环计算0~100累加和-15_彭世瑜_新浪博客
  14. 【Some】【心学】心学精华,人生要旨
  15. 28款静态网站快速搭建生成器
  16. There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案
  17. 蓝桥杯Java B组2015年真题
  18. Linux 系统发展史小览 (与Unix区别科普文)
  19. 记录两种打包后在手机上看日志的方法(vconsole和eruda)
  20. VISIONPRO中使用工业相机采集图像的两种方式分享

热门文章

  1. jzoj4279-[NOIP2015模拟10.29B组]树上路径【树形dp】
  2. jzoj3793,P2090-数字对【更相减损术,欧几里得算法,数论】
  3. P4564 [CTSC2018]假面(期望)
  4. 【KMP】子串拆分(ybtoj KMP-4)
  5. 【贪心】奶牛晒衣服(ybtoj 贪心-1-1)
  6. 2、mybatis的基本使用
  7. 揭秘阿里秒级百万TPS平台架构实现
  8. Mybatis与Hibernate的详细对比
  9. 漫画算法:如何判断链表有环
  10. 【JDBC】各版本jar包下载网址及Tomcat下载