mockito参数匹配_Mockito匹配器优先

mockito参数匹配

这篇文章是意见。

让我们看一下Mockito中用于在Java中进行测试的verify方法。

示例: verify(myMock).someFunction(123) –期望在模拟ONCE上使用输入123调用someFunction

BDDMockito ,我更喜欢完整的BDDMockito替代方案,因此请编写then(myMock).should().someFunction(123)

相同的基本概念。

三种匹配方法

您可以通过三种不同的机制将值提供给验证功能链:

  • 对象/文字价值
  • 参数匹配器
  • 争吵者

我认为,上述也是优先次序,而绑架者是不得已而为之。 让我们探讨一下机制。

具体的测试是最好的

理想情况下,理论上您将测试定义为类似的内容– 给定此输入,当系统运行时,输出为X。 当我们验证出站函数调用时,我们冒着测试存在实现线的风险,而不是测试行为,但是可以合理地说,如果系统运行正常,那么我们期望某些事情会发生。发送到某个目标或其他目标。

通常,如果我们将模块设计为具有清晰的输入和清晰的可测量的输出,那么您可以预测给定输入应输出的内容。

例:

 EmailBuilder builder = new EmailBuilder(mockEmailObject);  builder.setRecipients( "me@you.com, him@her.com, it@them.com" );  then(mockEmailObject) .should() .addRecipient( "me@you.com" );  then(mockEmailObject) .should() .addRecipient( "him@her.com" );  then(mockEmailObject) .should() .addRecipient( "it@them.com" ); 

注意:在这里我没有告诉您有关周围代码的任何信息,但是我猜您可以从简单测试中读取setRecipients的预期行为。

这就是为什么具体的测试数据在测试中占了上风,并且是我们的第一个也是最简单的方法。

当数据不重要时

有时候,我们所关心的并不是输入的价值,而是它的性质。 在上面的示例中,也许我们的某些测试可以跳过使用的电子邮件地址,而是关注更高级别的关注,例如是否拨打了电话或打了多少电话。

如果我在单元测试中看到了这一点,我不会感到震惊:

 verify(mockEmailObject, times( 3 )).addRecipient(anyString()); 

这里使用了一个参数匹配器来进行更模糊的断言,但这也许就足够了。 将所有内容锁定为具体数据可以使测试更加脆弱,尽管对于需要清晰的输入/输出映射的低级算法来说值得这样做,但可以放心地将其隐含在更高的模糊断言中,因为您不必担心关于确切的值。

我们可以在这里使用Mockito的argThat

 verify(mockEmailObject, times( 3 )) .addRecipient(argThat(recipient -> recipient.matches( "[az]+@[az]+\\.com" ))); 

argThat匹配器使我们可以使用Java Predicate来提供有关期望的一些逻辑。 这使我们能够在此处使用正则表达式来检查电子邮件地址是否正确(在此测试数据的范围内)。 这个技巧对于用生成的值(如GUID或时间戳)进行测试非常有用。

我们还可以使用argThat从输入中选择字段进行检查。

但是,当您要对发送到模拟函数的对象进行复杂的断言时,本能是使用ArgumentCaptors 。 我仍然认为它们是不得已的方法。

着迷的俘虏

让我们使用ArgumentCaptor解决电子邮件正则表达式问题。

 // in the instance variable section of the test:  @Captor // assuming you're using MockitoExtension/MockitoJUnitRunner... DO!  private ArgumentCaptor<String> stringCaptor;  @Mock  private Email mockEmailObject;  @Test  void whenAddingRecipientsFromToLine_thenEachIsAddedSeparately() { void EmailBuilder builder = new EmailBuilder(mockEmailObject); builder.setRecipients( "me@you.com, him@her.com, it@them.com" ); then(mockEmailObject) .should(times( 3 )) .addRecipient(stringCaptor.capture()); stringCaptor.getAllValues() .forEach(value -> assertThat(value).matches( "[az]+@[az]+\\.com" );  } 

在某些文章中,以上内容是讨论的结局。 吹牛打鼓的例子。 哇。 看看它是如何构成惊人的创造物的! 但…

尽管以上内容确实说明了如何使用捕获程序,并向您展示了如何拔出所有呼叫或一个呼叫,然后使用自己喜欢的断言库对它进行任何喜欢的断言,以及如何将其与前两个进行比较例子。

比较方式

具体的例子是:

  • 叫什么时候
  • 然后您得到价值为A的电话
  • 还有一个值B
  • 还有一个值C

匹配器示例具有:

  • 叫什么时候
  • 然后,您将获得三个与此表达式匹配的电话

参数捕获示例为:

  • 叫什么时候
  • 然后您会接到三个电话– 记住他们
  • 当您检查这些调用的值时
  • 然后他们匹配这些断言

注意:后面的测试在参数捕获时口吃。 然后 ,在检查捕获的参数方面,下一步需要做一些提取工作。 因此,它是一种用于特定目的的工具,其中将断言嵌入argThat或内置的匹配器之一不够强大,或者没有提供有意义的测试失败输出。

翻译自: https://www.javacodegeeks.com/2020/04/mockito-matchers-precedence.html

mockito参数匹配

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

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

相关文章

Redis入门(二)之数据类型

一、Redis 数据类型 Redis支持五种数据类型&#xff1a; &#xff08;1&#xff09;string&#xff08;字符串&#xff09; &#xff08;2&#xff09;hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;list&#xff08;列表&#xff09; &#xff08;4&#x…

关于Object.clone克隆方法的测试

【0】README 0.1&#xff09;本文旨在用源代码测试说明&#xff0c; Object.clone 的 的克隆机制&#xff08;深拷贝 还是 浅拷贝&#xff09; 的问题&#xff1b; 0.2&#xff09;本文还添加了对System.arraycopy本地方法的测试&#xff08;干货——推荐使用该方法进行数组复…

超音速 启动_超音速亚原子图

超音速 启动MicroProfile GraphQL现在包含在刚发布的Quarkus 1.5.0版本中。 现在&#xff0c;您可以使用code.quarkus.io开始使用Quarkus&#xff0c;并包括SmallRye GraphQL Extension 。 这将创建一个具有以下依赖关系的Quarkus启动器应用程序&#xff1a; <dependency…

Java Json解析

一、Json &#xff08;1&#xff09;语法a.名称/值对数据表示b.大括号持有的对象和每个名称后跟“&#xff1a;”&#xff08;冒号&#xff09;&#xff0c;名称/值对的分离&#xff0c;&#xff08;逗号&#xff09;。c.方括号持有数组和值&#xff0c;&#xff08;逗号&#…

flink 卡夫卡_卡夫卡–一次语义学

flink 卡夫卡在分布式环境中&#xff0c;故障是很常见的情况&#xff0c;可以随时发生。 在Kafka环境中&#xff0c;代理可能崩溃&#xff0c;网络故障&#xff0c;处理故障&#xff0c;发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。 失败…

Word中标题、图表自动编号的方法

转自&#xff1a;http://blog.sciencenet.cn/blog-344887-543229.html一般情况下&#xff0c;Word文档需要为标题提供连续编号&#xff0c;默认的标题样式并没有自动编号的功能&#xff0c;系统默认的标题样式效果如下图&#xff1a;正确设置标题自动编号的方法具体步骤如下&am…

java jsp总结

一、jsp简介 JSP&#xff08;全称Java Server Pages&#xff09;是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求&#xff0c;而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。 JSP 技术是以 Java 语言作为脚本语言的&am…

maven 构建增量包_使用Maven进行增量构建

maven 构建增量包这是2020年&#xff0c;如果您要开始任何新的基于Java的项目&#xff0c;那么gradle应该是第一选择&#xff0c;但是由于某些原因&#xff0c;如果您仍然对Maven感兴趣&#xff0c;那么您可能会发现这篇文章很有用。 Maven Java / scala编译器插件对增量编译提…

带Quarkus的Qute模板

Quarkus附带了自己的模板引擎Qute&#xff0c;该引擎已经包含了一组有趣的功能。 在下面的视频中&#xff0c;我将展示基于动作的MVC与JAX-RS的基本用法&#xff0c;该行为将我们的请求转发到HTML模板。 要自己尝试Qute&#xff0c;请查看以下资源&#xff1a; 示例项目 Qut…

Spring的IoC与DI差异

一、IoC IoC&#xff0c;全称为Inversion of Control&#xff0c;即控制反转。 IoC是依赖倒置原则的一种代码设计思想&#xff0c;把创建对象的权利交给框架&#xff0c;是框架的重要特征。其包括依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;和依赖…

jvm(3)-垃圾收集器与内存分配策略

【0】README0.1&#xff09;本文部分文字转自&#xff1a;深入理解jvm&#xff0c;旨在学习 垃圾收集器与内存分配策略 的基础知识&#xff1b;【1】垃圾回收概述1&#xff09;GC&#xff08;Garbage Collection&#xff09;需要完成的3件事情&#xff1a;哪些内容需要回收&…

防火墙例外里没有远程桌面_证明没有例外

防火墙例外里没有远程桌面您如何证明虚无的存在&#xff1f; 你应该&#xff1f; 在我编写的某些测试中&#xff0c;尤其是围绕验证或创建空对象的测试中&#xff0c;我真正想写的是这样的&#xff1a; assertThat( ... call some code ... ) .doesntThrow(); 您可以合理地编…

Java工程师必备技能

一、JavaSE &#xff08;1&#xff09;Java基础 1、数据结构 2、算法 3、包装类 4、字符串 5、异常处理 6、类与接口 7、泛型 8、集合 9、IO操作 10、序列化 11、迭代 12、枚举 13、properties 14、压缩 15、日期 &#xff08;2&#xff09;Java进阶 1、多线…

打破双亲委派么,怎么打破_打破了vs你错了

打破双亲委派么,怎么打破为微服务构建REST API时&#xff0c;需要做出一些关于响应的设计决策。 某些响应显然是微服务周围协议的产物-例如3xx代码之类的东西都与重定向和路由有关。 通常&#xff0c;您将尝试获取正确的2xx代码以取得成功。 如有疑问&#xff0c;将为200&…

java如何查看调用记录_查看Java记录

java如何查看调用记录JEP 359 &#xff08;可在JDK 14中用作预览功能&#xff09;将记录引入Java。 记录是对普通数据聚合建模的简单方法。 一个简单的范围记录如下所示&#xff1a; record Range( int from, int to) {} 记录定义实际上与具有以下内容的最终类相同&#xff1…

递归 反转字符串_使用递归反转字符串

递归 反转字符串1.简介 在本文中&#xff0c;您将学习如何使用递归方法来反转字符串。 第一个程序是反转字符串&#xff0c;第二个程序将读取用户的输入。 在之前的文章中&#xff0c;我已经展示了如何不使用任何内置函数来反转字符串&#xff0c;以及如何反转字符串中的单词 …

jvm(4)-虚拟机性能监控与故障处理工具

【0】README0.1&#xff09;本文文字描述转自 “深入理解jvm”&#xff0c;旨在了解 虚拟机性能监控与故障处理工具的基础知识&#xff08;仅仅在于了解&#xff09;&#xff1b; 【1】概述1&#xff09;给一个系统定位问题的时候&#xff0c;知识&#xff0c;经验是关键基础&a…

代码大全和新月神话_神话般的代码

代码大全和新月神话考虑以下代码段&#xff1a; int max 10; int a 0; while (true) {// do a thing that may result in an early return if (a > max) {break;} }throw new RuntimeException("It ran out of attempts");上面有一些WTF。 循环有点不可思议&am…

Spring 思维导图,让 Spring 不再难懂(cache篇)

转载自&#xff1a; java思维导图 开源中国关于缓存缓存是实际工作中非常常用的一种提高性能的方法。而在java中&#xff0c;所谓缓存&#xff0c;就是将程序或系统经常要调用的对象存在内存中&#xff0c;再次调用时可以快速从内存中获取对象&#xff0c;不必再去创建新的重…

动手学习_动手选择值

动手学习由于冠状病毒的存在&#xff0c;可选的东西在空中&#xff0c;一切都变得可选&#xff0c;例如可选的公共聚会&#xff0c;可选的在家工作&#xff0c;可选的旅行等。 我现在是时候谈论处理NULL引用的软件工程中真正的“ 可选 ”了。 托尼霍尔&#xff08;Tony Hoare…