使用类似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