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

使用类似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生成测试时才使用该方法。 对于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

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

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

相关文章

python编程的基本方法有哪些_Python编程中常用的基础知识有哪些?

今天小编要跟大家分享的文章是关于Python编程中常用的基础知识有哪些?正在从事Python相关工作的小伙伴们,来和小编一起看一看本篇文章,希望本篇文章能够对大家有所帮助。1、正则表达式替换目标: 将字符串 line 中的 overview.gif 替换成其他字符串>&…

java取网页源码_Java获取任意http网页源代码的方法

本文实例讲述了JAVA获取任意http网页源代码。分享给大家供大家参考,具体如下:JAVA获取任意http网页源代码可实现如下功能:1. 获取任意http网页的代码2. 获取任意http网页去掉HTML标签的代码Webpage类:/*** 网页操作相关类*/packag…

python数据结构算法优势_Python数据结构与算法(一)----- 算法效率

一.引入先来看一道题:如果abc1000, 且a2b2c^2(a,b,c为自然数),如何求出所有a,b,c可能的组合?(1) 枚举法import timestart_time time.time()for a in range(0,1001):for b in range(0,1001):for c in range(1,1001):if abc1000 and a**2b**2 …

Java编程字符逆序输出_用JAVA编写一程序:从键盘输入多个字符串到程序中,并将它们按逆序输出在屏幕上。...

展开全部代码如下:import java.util.Scanner;public class ScannerDemo{public static void main(String[] args) throws Exception{Scanner scannew Scanner(System.in);System.out.println("请输入内容:");String strscan.nextLine();char[]…

glassfish 4配置_自己构建GlassFish 4.0快照

glassfish 4配置这篇文章是关于自己发布GlassFish 4.0快照的,其中包括一些黑客。 我找到了GlassFish FullBuild的官方说明,然后决定自己构建服务器。 有时,您可能不想等待团队升级GlassFish构建文件。 在本条目中,我将Artifactory…

julia与python对比_有人说Julia比Python好,还给出了5个理由

选自medium作者:Emmett Boudreau机器之心编译参与:杜伟、张倩、肖清本文作者从速度、通用性、多重派发、适用于 ML 的程度和包管理器 5 个方面阐述了 Julia 语言相较于 Python 的优势所在。Julia 是一种多范式的函数式编程语言,用于机器学习和…

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

RxJava缺少创建无限自然数流的工厂。 这样的流很有用&#xff0c;例如&#xff0c;当您想通过压缩两个事件的唯一序列号给可能的无限事件流时&#xff1a; Flowable<Long> naturalNumbers //???Flowable<Event> someInfiniteEventStream //... Flowable<P…

java字符串构造函数的应用_StringTokenizer类的使用

StringTokenizer是一个用来分隔String的应用类&#xff0c;相当于VB的split函数。1.构造函数public StringTokenizer(String str)public StringTokenizer(String str, String delim)public StringTokenizer(String str, String delim, boolean returnDelims)第一个参数就是要分…

linkedhashmap获取第n个元素_机试真题分享——交换链表前后第K个元素

题目描述给定一个编码链表和一个加密条件K&#xff0c;对编码进行加密。加密规则&#xff1a;把编码从前往后开始数第K个元素和从后往前数第K个元素进行交换。注意&#xff1a;编码的长度为0.第一个编码的序号是1.示例&#xff1a;输入&#xff1a;[1 2 3 4 5 6] 2输出&#xf…

maven java 参数_将Maven参数注入Java类

我想将settings.xml配置文件参数注入Java类.我尝试使用maven-annotation-plugin,但值为null.我想知道这是不是因为这个插件是为Mojo设计的Setting.xml片段APP_NAMEUSER_EMAILUSER_PASSWORD在班上Parameter(defaultValue "test.email", readonly true)private Strin…

Spring Boot Admin –用于管理Spring Boot应用程序的Admin UI

作为微服务开发的一部分&#xff0c;我们许多人都将Spring Boot与Spring Cloud功能一起使用。 在微服务领域&#xff0c;我们将有许多Spring Boot应用程序将在相同/不同的主机上运行。 如果将Spring Actuator添加到Spring Boot应用程序中&#xff0c;我们将获得很多现成的端点来…

md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?

算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发。软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能。算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程工作只需要遭循这个思路去实现即可。本章将详细讲解计算机算法的基…

java json 解析null_解析包含null的原始json数组

Json数组遇新是直朋能到&#xff1a;{"userName":null," msgArr":[null],"numrow":0} //String resultGson&#xff1a;new Gson().fromJson(result, MyClass.class);MyCl作一新求抖直微圈ass:public String userName;public int[] msgArr;...错…

python运维脚本部署jdk_基于Java/Python搭建Web UI自动化环境

Java搭建UI自动化测试环境下载JDK8https://www.cnblogs.com/thloveyl/p/12378124.html配置Java环境1.解压Jdk压缩包2.配置环境变量计算机->属性->高级->环境变量->系统变量->Path3.添加根目录下的bin与lib目录、jre下的bin目录(近期我发现只将bin目录加入Path就…

eclipse JAVA用户注册_如何eclipse编写一个简单实用的登陆界面

花了点时间写了一个简单的页面&#xff1a;package test;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class UserInterface extends JFrame implements WindowListener{JFrame jf;JPanel jpan1,jpan2,jpan3;JLabel username,password,lspace;JText…

java内存泄漏案例_寻找内存泄漏:一个案例研究

java内存泄漏案例一周前&#xff0c;我被要求修复一个有内存泄漏问题的webapp。 考虑到过去两年左右的时间里我已经看到并修复了数百个泄漏&#xff0c;我想这有多难。 但是事实证明这是一个挑战。 12小时后&#xff0c;我发现该应用程序中不少于5个漏洞&#xff0c;并设法修复…

doc无法编译java文件_java编译成jar文件.doc

java编译成jar文件Java程序打包成jar包(2012-06-08 10:28:23)转载▼标签&#xff1a;分类&#xff1a; 方法一&#xff1a;通过jar命令jar命令的用法&#xff1a;下面是jar命令的帮助说明&#xff1a;用法&#xff1a;jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-p…

python 档案管理系统_Python 写入档案的 4 个方法

在 Python 写入档案内容跟读取档案差不多, 也很简单方便&#xff0c;以下会介绍用 Python 逐行读取档案内容的 4 种方法。在看例子前先要了解开启档案的参数, 一般上读取档案会用 “r”, 即唯读的意思, 如果要写入档案, 分别可以用 “w” (即 write 的意思) 或 “a” (即 appen…

高可用性(HA),会话复制,多VM Payara群集

抽象 在研究如何创建高可用性&#xff08;HA&#xff09;时&#xff0c;我发现了会话复制的多机Payara / GlassFish群集&#xff0c;无法在一个参考中找到所需的一切。 我认为这将是一个普遍的需求并且很容易找到。 不幸的是&#xff0c;我的假设是错误的。 因此&#xff0c;本…

java时间日期工具类_java日期处理工具类

java日期处理工具类import java.text.DecimalFormat;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Locale;import java.util.Random;import java…