tdd java_适用于Idea的面向现代TDD的Java 8 JUnit测试模板(带有Mockito和AssertJ)

tdd java

使用类似于BDD的语法,Java 8和Mockito-AssertJ二重奏为Idea调整JUnit测试类模板。

本文涵盖的主题似乎很简单。 但是,根据我的培训师经验,我知道(不幸的)这不是常见的做法。 因此,我决定写这篇简短的博客文章来传播它们,并在将来能够引用它。

我最喜欢的Java(和Groovy)测试框架是Spock 。 但是,它的模拟不适用于某些目的,我仍然在各种地方使用Mockito。 另外,我仍然针对已经在该堆栈中具有测试套件并且希望在不更改已知技术的情况下提高其技能的团队,在JUnit / Mockito / AssertJ变体中进行很多测试培训 。 因此,作为一个插曲,此博客文章介绍了纯Java风格的测试,并假设您已经在使用Mockito和AssertJ(在其他情况下,请尝试使用它们)建议如何调整JUnit测试框架。

此博客文章由树部分组成。 首先,我提出了一种BDD样式的基于节的测试结构,以使您的测试更一致,更易读。 接下来,我将说明如何使用Java 8简化使用AssertJ和Mockito的构造。最后但并非最不重要的一点是,我将展示如何在IntelliJ IDEA中将其配置为默认的JUnit测试(类)模板(这并不简单)这应该)。

第1部分。BDD样式的部分

编写良好的单元测试应满足几个要求(但这是单独发布的主题)。 有用的做法之一是将3个代码块明确划分为具有明确定义的职责。 您可以在我以前的博客文章中阅读有关该主题的更多信息 。

作为重复,仅以简短形式列出了核心规则:

  • given –测试中的对象初始化+存根/模拟的创建,存根和注入
  • when –在给定测试中进行测试的操作
  • then –收到结果声明+模拟验证(如果需要)
@Test
public void shouldXXX() {//given...//when...//then...
}

这种分离有助于保持测试的简短性,并将重点放在测试的一项责任上(最终这只是一个单元测试)。

在Spock中,这些部分是必填(*)–没有它们,测试甚至无法编译。 在JUnit中只有注释。 但是,将它们放置在适当位置会鼓励人们使用它们,而不是在内部放置一大堆混乱(对于测试区域的新手尤其有用)。

顺便说一句,提到的“先给后定”约定基于更广泛的“ 行为驱动开发”概念(是其子集)。 您可能会在3个代码块上遇到类似的划分,这些代码块称为ranging-act-assert,通常这是等效的。

第2部分。AssertJ和Mockito的Java 8

Java 8的功能之一是能够将默认方法放入接口。 这可以用来简化对静态方法的调用,这在测试框架(如AssertJ和Mockito)中很普遍。 这个想法很简单。 愿意使用给定框架的测试类可以实现一个专用接口,以在IDE中完成代码时将这些方法“视为”自己的方法(而不是外部类的静态方法,这些方法要求在输入类名之前或静态导入) 。 那些默认方法只是将执行委托给静态方法。 您可以在我的其他博客文章中了解更多信息 。

AssertJ本机支持从3.0.0版本开始的那些构造。 Mockito 1.10和2.x与Java 6兼容,因此需要使用一个第三方项目– mockito-java8 (一旦可用,应将其集成到Mockito 3中)。

为了从Idea中更容易完成方法中受益,实现两个接口就足够了:

import info.solidsoft.mockito.java8.api.WithBDDMockito;
import org.assertj.core.api.WithAssertions;class SampleTest implements WithAssertions, WithBDDMockito {}

第3部分。Idea中的默认模板

我是无所不在的自动化的狂热爱好者。 在测试类中同时自动设置“先给定”部分和额外的接口,这不是很好吗? 让我们从生活中消除那些无聊的事情。

测试方法

更改JUnit测试方法很容易。 一种可能的方式是“ CTRL-SHIFT-A->文件模板->代码”,并将JUnit4 Test Method修改为:

@org.junit.Test
public void should${NAME}() {//given${BODY}//when//then
}

要在现有测试类中添加新测试,只需按ALT-INSERT并选择(或键入) JUnit4 Test Method

测试班

在整个测试课程中,情况要复杂一些。 Idea提供了一种编辑现有模板的方法,但是,仅当使用生产类中的CTRL-SHIFT-T生成测试时才使用Idea。 对于TDD,首先创建一个测试不是很方便。 如果在测试上下文中的程序包视图中按了ALT-INSERT则最好在“ Java类”旁边显示一个新位置“ New JUnit测试类”。 不幸的是,要做到这一点,就需要编写一个新插件(Spock的示例实现 )。 作为一种解决方法,我们可以定义一个常规文件模板(作为限制),该模板可在任何地方(例如,甚至在资源目录中)访问。

执行“ CTRL-SHIFT-A->文件模板->文件”,按INSERT ,将模板命名为“具​​有AssertJ和Mockito Test的JUnit”,将扩展名设置为“ java”,然后粘贴以下模板:

package ${PACKAGE_NAME};import info.solidsoft.mockito.java8.api.WithBDDMockito;
import org.assertj.core.api.WithAssertions;#parse("File Header.java") 
public class ${NAME} implements WithAssertions, WithBDDMockito {}

展示柜

我们已经准备好了。 让我们检查一下它在实际中的外观(单击以放大动画)。

摘要

我希望我说服您调整测试模板以提高测试的可读性并确保每个测试几次击键。 在这种情况下,请立即花费4分钟在您的Idea中对其进行配置。 根据编写的许多测试,它可能会比您所期望的更快开始回报:)。

顺便说一句,十月初,我将在克拉科夫的JDD 上发表有关Mockito 2新功能的演讲 。

自我提升 。 您想快速有效地提高您和您的团队的测试技能以及对Spock / JUnit / Mockito / AssertJ的了解吗? 我进行了浓缩(单元) 测试培训 ,您可能会觉得有用。

翻译自: https://www.javacodegeeks.com/2017/09/modern-tdd-oriented-java-8-junit-test-template-idea-mockito-assertj.html

tdd java

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

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

相关文章

Linux 进程状态介绍

文章目录进程状态说明进程状态图进程状态说明 进程主状态:D:不可中断的睡眠状态 uninterruptible sleeping(usually IO)R:正在运行,或在队列中的 running or runnable (on run queue)S:处于休眠状态 interruptible sle…

petalinux 配置_澧县高压管道工厂化配置专业销售

澧县高压管道工厂化配置专业销售 公司生产设备齐全,热处理工艺精湛,检测设备,年生产能力上万吨,具备化学分析、全相检验、物理实验、无损探伤等检测能力。能生产各种标准的不锈钢、合金钢、碳钢弯头、无缝弯管、无缝三通、高压异径…

php mysql刷新表格_php读入mysql数据并以表格形式显示(表单实现无刷新提交)

在网上参考了些例子,于是我这个sample实现了如标题上的功能。话不多说,上代码:lishi.html搜索form#form1 {height: 93%;}p {width: 99%;height: 84%;}iframe#id_iframe {width: 99%;height: 100%;border: 0 red solid;}input{display:block;}…

flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...

flowable背压 取消RxJava缺少创建无限自然数流的工厂。 这样的流很有用&#xff0c;例如&#xff0c;当您想通过压缩两个事件的顺序来为可能的无限事件流分配唯一的序列号时&#xff1a; Flowable<Long> naturalNumbers //???Flowable<Event> someInfiniteEve…

abstract类_【Java】类的结构 - Nemo

类与对象类中主要包括五种结构&#xff0c;下面进行对这五种结构进行详细的介绍。1. 面向对象与面向过程面向过程&#xff1a;强调的是功能行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。面向对象&#xff1a;强调具备了功能的对象&#xff0c;以类/对象为最小单位…

二元函数可微与可导的关系_多元函数中可微与可导的直观区别是什么?

在多元的情况下&#xff0c;可微可导的关系要比在一元情况下复杂&#xff0c;但是只是要复杂一些&#xff0c;如果我们从一元开始去理解&#xff0c;你会发现并不困难。这篇文章主要阐述以下三个概念&#xff1a;偏微分偏导数全微分全导数这里暂时不讲&#xff0c;看名字好像和…

java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常

java 错误输入异常在我以前的文章中&#xff0c;我写了一篇关于输入验证设计的文章 &#xff0c;该设计取代了难以维护和测试的 if-else块。 但是&#xff0c;正如某些读者指出的那样&#xff0c;它有一个缺点–如果输入数据有多个验证错误&#xff0c;则用户将不得不多次提交请…

Linux 命令之 mkdir 命令-创建目录

文章目录介绍语法格式常用选项参考示例介绍 mkdir 命令是“make directories”的缩写&#xff0c;用来创建目录。如果在目录名的前面没有加任何路径名&#xff0c;则在当前目录下创建目录&#xff1b;如果给出了一个已经存在的路径&#xff0c;将会在该目录下创建一个指定的目…

uniapp app蓝牙打印_给编程器加装蓝牙串口模块,用手机APP操作打印信息进控制台...

公众号回复【编程器】可下载蓝牙串口APP专用蓝牙串口模块购买&#xff1a;https://item.taobao.com/item.htm?id619731291566编程器加装蓝牙模块后&#xff0c;可以方便的使用手机查看打印信息&#xff0c;进入控制台执行各种串口命令。本款蓝牙串口APP具有保存打印信息、分享…

Linux 命令之 rm -- 删除文件和目录

文章目录一、命令介绍二、语法格式三、参考选项四、参考示例&#xff08;一&#xff09;删除当前目录下有内容的子目录&#xff08;二&#xff09;删除当前目录下多个含有内容的子目录&#xff08;三&#xff09;删除当前目录下以特定关键字开头的文件&#xff08;四&#xff0…

mysql报表占容量_MariaDB(MySQL)修改表结构报表空间满

今天数据库表修改表结构&#xff0c;需要添加一列&#xff1a;ALTER TABLE xxxx_learn ADD COLUMN learn_stage_code VARCHAR(32) NULL DEFAULT 99 COMMENT 学段 AFTER qualified_rate;结果一直报错&#xff1a;ERROR 1114 (HY000) at line 303: The table xxxx_learn is full刚…

对话框 函数_通过函数式编程实现动态对话框处理程序

对话框 函数在我以前的文章中&#xff0c;我提到了一个常见的用例&#xff0c;当我们需要以编程方式检查当前事务是否脏了&#xff0c;并在做某件事之前通知用户有关该事务的信息。 就像“您尚未保存的更改将丢失&#xff0c;您要继续吗&#xff1f;”。 假设我们需要在应用程…

Linux 命令之 yum -- 基于 RPM 的软件包管理器

文章目录一、命令介绍二、选项参数选项参数三、配置文件四、参考示例&#xff08;一&#xff09;安装、升级和删除包安装指定的软件包强制重新安装本地安装指定软件包本地更新指定软件包安装 yum 服务器中的所有可安装的软件安装程序组&#xff08;软件组&#xff09;安装 yum …

adb 最大连接_手机触屏失效的抢救办法,以及如何利用adb实现PC与手机交互

手机进水或者摔坏屏幕导致触屏失效的时候&#xff0c;一般情况下&#xff0c;要么选择换屏&#xff0c;要么选择把手机扔掉。但其实如果有一根OTG线&#xff0c;手机中的资料还可以安全备份出来&#xff0c;或者还可以再利用起来&#xff0c;发挥一下余热做点别的事。像上图一样…

proxy跨域不生效_前端开发:深入使用proxy代理解决跨域问题

在前端领域里面&#xff0c;跨域指的是浏览器允许向服务器发送跨域请求&#xff0c;进而克服Ajax只能同源使用的局限性限制。同源策略是一种约定&#xff0c;而且是浏览器中最基本也是最核心的安全功能&#xff0c;若缺少了该策略&#xff0c;浏览器非常容易被***&#xff1b;同…

java 静态缓存示例_Java 9 JShell示例:集合静态工厂方法

java 静态缓存示例这篇文章继续从My My Java 9 Features博客文章中探索Java9功能。 在这里&#xff0c;我们在List&#xff0c;Set和Map接口中试验Java9 Collections静态工厂方法。 集合静态工厂方法 Java9使用其新的静态工厂方法使创建不可变列表变得更加容易 有12种Set.of和…

mysql在计算机管理中的路径怎么修改_称重软件中的数据修改怎么知晓?

称重软件称重软件应客户需求&#xff0c;数据允许修改&#xff0c;但不允许删除只能作废。如果数据已修改&#xff0c;该如何知晓该数据是修改过的呢&#xff0c;这就用到了标记。用户修改数据时为保证数据的可追溯性&#xff0c;同样在数据安全方面也有相应的要求&#xff0c;…

pip安装mysql模块_使用pip安装mysql模块for python

我正在尝试使用pip安装mysql模块for python&#xff0c;但遇到了一个错误&#xff1a;mysqlclient.lib(typelib.obj) : error LNK2001: unresolved external symbol __iob_funcmysqlclient.lib(viosslfactories.obj) : error LNK2001: unresolved external symbol __iob_funcmy…

Linux 命令之 apt-get -- APT 软件包管理工具

文章目录 一、命令介绍二、语法格式三、相关文件及目录四、常用命令(一)下载、安装、升级和删除软件包(二)查询和检验软件包(三)执行其它功能五、常用选项(一)安装、升级和删除软件包(二)查询和检验软件包(三)执行其它功能六、参考示例(一)下载、安装、升级和删除…

spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...

spring health为什么 我们新JavaScript客户端应用程序会定期调用Grails后端的/health端点&#xff0c;以确定离线状态。 事情开始变得“​​有趣”。 我们免费获得该端点&#xff0c;因为Grails基于Spring Boot&#xff0c;而Spring Boot带有一个名为Spring Boot Actuator的子…