mockito

过去,很多人问我是否测试吸气剂和吸气剂(属性,属性等)。 他们还问我是否测试我的建筑商。 在我看来,答案取决于情况。

当使用遗留代码时,我不会费心去测试数据结构,这意味着对象只带有getter和setter,映射,列表等。原因之一是我从不模拟它们。 在测试使用它们的类时,我照原样使用它们。 对于构建器,当它们仅由测试类使用时,我也不会对其进行单元测试,因为它们在许多其他测试中均被用作“帮助者”。 如果它们有错误,则测试将失败。 总而言之,如果这些数据结构和构建器已经存在,那么我不会为它们进行改装测试。

但是,现在让我们谈谈进行TDD并假设您需要一个带有getter和setter的新对象。 在这种情况下,是的,我将为吸气剂和吸气剂编写测试,因为我需要先编写测试来证明它们的存在。
为了拥有丰富的领域模型,我通常倾向于将业务逻辑与数据相关联,并拥有更丰富的领域模型。 让我们看下面的例子。

在现实生活中,我会一次编写测试,使它们通过并重构。 在这篇文章中,为清晰起见,我仅向您提供完整的课程。 首先让我们编写测试:

package org.craftedsw.testingbuilders;import static org.hamcrest.Matchers.is;import static org.junit.Assert.assertThat;import static org.mockito.Matchers.anyString;import static org.mockito.Mockito.verify;import static org.mockito.Mockito.when;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.Mock;import org.mockito.runners.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)public class TradeTest {private static final String INBOUND_XML_MESSAGE = '<message >';private static final boolean REPORTABILITY_RESULT = true;private Trade trade;@Mock private ReportabilityDecision reportabilityDecision;@Beforepublic void initialise() {trade = new Trade();when(reportabilityDecision.isReportable(anyString())).thenReturn(REPORTABILITY_RESULT);}@Test public voidshould_contain_the_inbound_xml_message() {trade.setInboundMessage(INBOUND_XML_MESSAGE);assertThat(trade.getInboundMessage(), is(INBOUND_XML_MESSAGE));}@Test public voidshould_tell_if_it_is_reportable() {trade.setInboundMessage(INBOUND_XML_MESSAGE);trade.setReportabilityDecision(reportabilityDecision);boolean reportable = trade.isReportable();verify(reportabilityDecision).isReportable(INBOUND_XML_MESSAGE);assertThat(reportable, is(REPORTABILITY_RESULT));}}

现在执行:

package org.craftedsw.testingbuilders;public class Trade {private String inboundMessage;private ReportabilityDecision reportabilityDecision;public String getInboundMessage() {return this.inboundMessage;}public void setInboundMessage(String inboundXmlMessage) {this.inboundMessage = inboundXmlMessage;}public boolean isReportable() {return reportabilityDecision.isReportable(inboundMessage);}public void setReportabilityDecision(ReportabilityDecision reportabilityDecision) {this.reportabilityDecision = reportabilityDecision;}}

这种情况很有趣,因为Trade对象具有一个名为inboundMessage的属性,具有相应的getter和setter,并且在isReportable业务方法中还使用了一个协作者(reportabilityDecision,通过setter注入)。

我多次见过的“测试” setReportabilityDecision方法的常见方法是引入getReportabilityDecision方法,该方法返回reportabilityDecision(协作者)对象。

这绝对是错误的方法。 我们的目标应该是测试协作器的使用方式,即是否使用正确的参数调用协作器,以及是否使用返回的任何东西(如果返回任何东西)。 在这种情况下引入吸气剂是没有意义的,因为它不能保证在通过设置器注入了协作者之后,对象将按照我们的预期与协作者进行交互。

顺便说一句,当我们编写有关将如何使用协作者的测试时,定义它们的接口是在将TDD用作设计工具而不仅仅是将其用作测试工具时。 我将在以后的博客文章中进行介绍。

好的,现在假设可以以不同的方式(即具有不同的可报告性决策)创建此贸易对象。 我们还希望使代码更具可读性,并决定为Trade对象编写一个生成器。 在这种情况下,我们还假设我们希望生成器也用于生产和测试代码中。 在这种情况下,我们要测试驱动器。

这是我通常在开发人员测试驱动构建器实现时发现的一个示例。

package org.craftedsw.testingbuilders;import static org.craftedsw.testingbuilders.TradeBuilder.aTrade;import static org.hamcrest.Matchers.is;import static org.junit.Assert.assertThat;import static org.mockito.Mockito.verify;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.Mock;import org.mockito.runners.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)public class TradeBuilderTest {private static final String TRADE_XML_MESSAGE = '<message >';@Mockprivate ReportabilityDecision reportabilityDecision;@Test public voidshould_create_a_trade_with_inbound_message() {Trade trade = aTrade().withInboundMessage(TRADE_XML_MESSAGE).build();assertThat(trade.getInboundMessage(), is(TRADE_XML_MESSAGE));}@Test public voidshould_create_a_trade_with_a_reportability_decision() {Trade trade = aTrade().withInboundMessage(TRADE_XML_MESSAGE).withReportabilityDecision(reportabilityDecision).build();trade.isReportable();verify(reportabilityDecision).isReportable(TRADE_XML_MESSAGE);}}

现在让我们看看这些测试。 好消息是,测试以开发人员希望阅读的方式编写。 这也意味着他们正在“设计” TradeBuilder公共接口(公共方法)。 坏消息是他们如何测试它。

如果仔细看,构建器的测试与TradeTest类中的测试几乎相同。
您可能会说没问题,因为构建器正在创建对象,并且测试应该相似。 唯一的不同是,在TradeTest中我们手动实例化对象,在TradeBuilderTest中我们使用构建器实例化对象,但是断言应该相同,对吗?
对我来说,首先我们要重复。 其次,TradeBuilderTest没有显示出它的真实意图。 经过多次重构和探索不同的想法之后,在与团队中的一个人进行配对编程时,我们想到了这种方法:

package org.craftedsw.testingbuilders;import static org.mockito.BDDMockito.given;import static org.mockito.Mockito.verify;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.Spy;import org.mockito.runners.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)public class TradeBuilderTest {private static final String TRADE_XML_MESSAGE = '<message >';@Mock private ReportabilityDecision reportabilityDecision;@Mock private Trade trade;@Spy @InjectMocks TradeBuilder tradeBuilder;@Test public voidshould_create_a_trade_with_all_specified_attributes() {given(tradeBuilder.createTrade()).willReturn(trade);tradeBuilder.withInboundMessage(TRADE_XML_MESSAGE).withReportabilityDecision(reportabilityDecision).build();verify(trade).setInboundMessage(TRADE_XML_MESSAGE);verify(trade).setReportabilityDecision(reportabilityDecision);}}

因此,现在,TradeBuilderTest表达了TradeBuilder的期望,即调用build方法时的副作用。 我们希望它创建交易并设置其属性。 TradeTest没有重复项。 它留给TradeTest来保证Trade对象的正确行为。
为了完善起见,这是最后的TradeBuider类:

package org.craftedsw.testingbuilders;public class TradeBuilder {private String inboundMessage;private ReportabilityDecision reportabilityDecision;public static TradeBuilder aTrade() {return new TradeBuilder();}public TradeBuilder withInboundMessage(String inboundMessage) {this.inboundMessage = inboundMessage;return this;}public TradeBuilder withReportabilityDecision(ReportabilityDecision reportabilityDecision) {this.reportabilityDecision = reportabilityDecision;return this;}public Trade build() {Trade trade = createTrade();trade.setInboundMessage(inboundMessage);trade.setReportabilityDecision(reportabilityDecision);return trade;}Trade createTrade() {return new Trade();}}

Mockito和Hamcrest的结合非常强大,使我们能够编写更好,更易读的测试。

参考:来自Crafts Software博客的JCG合作伙伴 Sandro Mancuso的Mockito和Hamcrest的测试驱动构建器 。

翻译自: https://www.javacodegeeks.com/2012/06/test-driving-builders-with-mockito-and.html

mockito

mockito_Mockito和Hamcrest的试驾制造商相关推荐

  1. Mockito和Hamcrest的试驾制造商

    过去,很多人问我是否测试吸气剂和吸气剂(属性,属性等). 他们还问我是否测试我的建筑商. 在我看来,答案取决于情况. 当使用遗留代码时,我不会费心去测试数据结构,这意味着对象只带有getter和set ...

  2. ml不是内部或外部命令_美国飞机制造商波音公司采用VR技术训练宇航员 ; Snap Lens Studio推出支持自定义ML驱动的Snapchat镜头...

    看日报是个好习惯!  Valve宣布为Steam开发者推出OpenXR预览版本,支持跨平台VR/AR内容开发  Valve在为Steam游戏开发人员迎接OpenXR面世的准备方面迈出了重要的一步,开发 ...

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

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

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

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

  5. AI一分钟 | 小米公布Q2财报,上市以来股价振幅高达30%;俄制造商推出步行杀手机器人...

    ▌小米二季度 IoT 收入翻番,上市以来股价振幅高达 30% 8 月 22 日,小米集团公布了 2018 年半年报,这也是小米集团上市以来的首份财报.财报显示,今年上半年,小米收入 796.48 亿元 ...

  6. AI一分钟|欧盟将对Google开出天价罚单;智能家居制造商Nest并入Google;沃尔玛与微软合作挑战AWS...

    ▌沃尔玛将与微软达成战略合作,利用云计算和 AI 挑战亚马逊 7 月 18 日消息,据路透社报道,当地时间周二,零售巨头沃尔玛表示,将与微软结成战略合作伙伴关系,更广泛的采用微软云计算和人工智能(AI ...

  7. AI一分钟 | 小米发布小爱音箱mini,169元;天猫汽车无人贩卖机大楼落地,刷脸可购车试驾

    2018 区块链技术及应用峰会(BTA)·中国 倒计时 3 天 2018,想要follow最火的区块链技术?你还差一场严谨纯粹的技术交流会--2018区块链技术及应用峰会(BTA)·中国将于2018年 ...

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

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

  9. 锐界机器人_看着就很酸爽,2.7T V6双涡轮,车则试驾新福特锐界ST

    本文编辑 写在前面: 本文系车则原创稿件,转载请注明来源"车则",请勿侵权 车则曾有幸在福特发布:全新福克斯Active.全新金牛座.新锐界ST/ST-Line三车现场,试了一下来 ...

最新文章

  1. c++ 判断数学表达式有效性_高考数学大题如何quot;保分quot;?学霸教你六大绝招!...
  2. OpenCASCADE绘制测试线束:简单的向量代数和测量之测量命令
  3. QDoc文字标记textmarkup
  4. Sword STL之map效率问题
  5. service mysqld start,Failed to start mysqld.service: Access denied
  6. 安装、卸载、查看软件时常用的命令
  7. JAVA不同类型数组重载_JAVA补课-DAY1:方法重载和数组
  8. c语言中参数的传递方式是,C语言函数的参数及传递方式
  9. C++工作笔记-对二级指针的进一步理解(获取调用者的地址)
  10. 客制化键盘键位修改_IQUNIX Slim87 RGB机械键盘评测
  11. leetcode - 647. 回文子串
  12. mysql mvcc gap lock_为什么说 MVCC 和 Gap Lock 解决了 MySQL 的幻读问题
  13. 过年战胜熊孩子骚扰的终极攻略,拿走不谢!
  14. python网络爬虫的特点_Python网络爬虫(一)- 入门基础
  15. DXUT框架剖析(1)
  16. Node.js Unix/Linux NVM
  17. 快播之父卷土重来 发布升级版快播,首个区块链视频Bliface
  18. Linux安装及破解密码
  19. AngularJS - $uibModal - 自定义模态框大小
  20. Grounded theory相关知识

热门文章

  1. 高级 Java 必须突破的 10 个知识点
  2. layui结合springboot上传图片
  3. 让java的多重继承成为现实!
  4. 使用阿里云智能翻译接口案例——CSDN博客
  5. C++实现字符串的拼接
  6. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  7. Java虚拟机详解----常用JVM配置参数
  8. MarkdownPad 汉化破解(含下载地址)
  9. vaadin_Vaadin提示:以声明方式构建UI
  10. couchbase_具有Couchbase,Java EE和WildFly的CRUD Java应用程序