`

Junit4 新断言语法介绍[转]

阅读更多

1. 引言
JUnit4提供的新断言语法具有很多优点且使用简单,这已经不再是新鲜事了,可发现在实际测试代码中仍未被普及应用,特发此文,以期更多的人能掌握运用。
2. assertThat基本语法
Hamcrest 是一个测试辅助工具,提供了一套通用的匹配符 Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。
Junit4结合Hamcrest提供了新的断言语句-assertThat,只需一个assertThat语句,结合Hamcrest提供的匹配符,就可以表达全部的测试思想。
assertThat的基本语法如下:

assertThat(T actual, Matcher matcher)
assertThat(String reason, T actual, Matcher matcher)

actual 是接下来想要验证的值;
matcher是使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 actual值与 matcher 所表达的期望值相符,则断言成功,否则断言失败。
reason是自定义的断言失败时显示的信息。
一个简单的例子:
// 如果测试的字符串testedString包含子字符串"taobao"则断言成功
assertThat( testedString, containsString( "taobao" ) );
3. assertThat优点

统一

只需一条assertThat语句即可替代旧有的其他语句(如assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull等),使断言变得简单、代码风格统一,增强测试代码的可读性和可维护性。

语法直观易懂

assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);)。相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读,符合人类思维习惯。

错误信息更具描述性

旧的断言语法如果断言失败,默认不会有额外的提示信息,如
assertTrue(testedString.indexOf(”taobao”) > -1);
如果该断言失败,只会抛出无用的错误信息,如java.lang.AssertionError: ,除此之外不会有更多的提示信息。
新的断言语法会默认自动提供一些可读的描述信息,如
assertThat(testedString, containsString(”taobao”));
如果该断言失败,抛出的错误提示信息如下:
java.lang.AssertionError:
Expected: a string containing “taobao”
got: “taoba”

跟Matcher匹配符联合使用更灵活强大

Matcher提供了功能丰富的匹配符,assertThat结合这些匹配符使用可更灵活更准确的表达测试思想。
// 验证字符串 s是否含有子字符串 "taobao" 或 "qa" 中间的一个
// 旧的断言,不直观,需要分析代码逻辑明白验证意图
assertTrue(s.indexOf("taobao")>-1||s.indexOf("qa")>-1);
// 新的断言,直观易懂,准确表达测试思想
assertThat(s,anyOf(containsString("taobao"),containsString("qa")));
// anyOf满足条件之一即成立,containsString包含字符串则成立
4. assertThat使用
要想发挥assetThat的威力,必须跟Hamcrest联合使用,JUnit4本身包含了一些自带了一些 Hamcrest 的匹配符 Matcher,但是只有有限的几个。因此建议你将Hamcrest包加入项目。
在pom里加入Hamcrest依赖。
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.1</version>
</dependency>
在测试类里导入包
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
通过例子学习是有效的学习方式之一,下面通过常用的示例演示如何使用assertThat,更详细的用法请参考Hamcrest相关文档。

字符相关匹配符


/**equalTo匹配符断言被测的testedValue等于expectedValue,
* equalTo可以断言数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法
*/
assertThat(testedValue, equalTo(expectedValue));

/**equalToIgnoringCase匹配符断言被测的字符串testedString
*在忽略大小写的情况下等于expectedString
*/
assertThat(testedString, equalToIgnoringCase(expectedString));

/**equalToIgnoringWhiteSpace匹配符断言被测的字符串testedString
*在忽略头尾的任意个空格的情况下等于expectedString,
*注意:字符串中的空格不能被忽略
*/
assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);

/**containsString匹配符断言被测的字符串testedString包含子字符串subString**/
assertThat(testedString, containsString(subString) );

/**endsWith匹配符断言被测的字符串testedString以子字符串suffix结尾*/
assertThat(testedString, endsWith(suffix));

/**startsWith匹配符断言被测的字符串testedString以子字符串prefix开始*/
assertThat(testedString, startsWith(prefix));

一般匹配符


/**nullValue()匹配符断言被测object的值为null*/
assertThat(object,nullValue());

/**notNullValue()匹配符断言被测object的值不为null*/
assertThat(object,notNullValue());

/**is匹配符断言被测的object等于后面给出匹配表达式*/
assertThat(testedString, is(equalTo(expectedValue)));

/**is匹配符简写应用之一,is(equalTo(x))的简写,断言testedValue等于expectedValue*/
assertThat(testedValue, is(expectedValue));

/**is匹配符简写应用之二,is(instanceOf(SomeClass.class))的简写,
*断言testedObject为Cheddar的实例
*/
assertThat(testedObject, is(Cheddar.class));

/**not匹配符和is匹配符正好相反,断言被测的object不等于后面给出的object*/
assertThat(testedString, not(expectedString));

/**allOf匹配符断言符合所有条件,相当于“与”(&&)*/
assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );

/**anyOf匹配符断言符合条件之一,相当于“或”(||)*/
assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );

数值相关匹配符


/**closeTo匹配符断言被测的浮点型数testedDouble在20.0¡À0.5范围之内*/
assertThat(testedDouble, closeTo( 20.0, 0.5 ));

/**greaterThan匹配符断言被测的数值testedNumber大于16.0*/
assertThat(testedNumber, greaterThan(16.0));

/** lessThan匹配符断言被测的数值testedNumber小于16.0*/
assertThat(testedNumber, lessThan (16.0));

/** greaterThanOrEqualTo匹配符断言被测的数值testedNumber大于等于16.0*/
assertThat(testedNumber, greaterThanOrEqualTo (16.0));

/** lessThanOrEqualTo匹配符断言被测的testedNumber小于等于16.0*/
assertThat(testedNumber, lessThanOrEqualTo (16.0));

集合相关匹配符


/**hasEntry匹配符断言被测的Map对象mapObject含有一个键值为"key"对应元素值为"value"的Entry项*/
assertThat(mapObject, hasEntry("key", "value" ) );

/**hasItem匹配符表明被测的迭代对象iterableObject含有元素element项则测试通过*/
assertThat(iterableObject, hasItem (element));

/** hasKey匹配符断言被测的Map对象mapObject含有键值“key”*/
assertThat(mapObject, hasKey ("key"));

/** hasValue匹配符断言被测的Map对象mapObject含有元素值value*/
assertThat(mapObject, hasValue(value));

 

分享到:
评论

相关推荐

    Junit4入门使用介绍

    #### 七、JUnit断言方法 JUnit4提供了一系列的断言方法来验证测试结果,这些方法位于`org.junit.Assert`包下,包括但不限于: - `assertEquals(a, b)`: 检查两个对象是否相等。 - `assertFalse(a) / assertTrue(a)`...

    单元测试利器 JUnit 4

    总的来说,JUnit 4以其简洁的注解语法和强大的断言机制,使得单元测试变得高效且易于维护。它不仅帮助开发者编写可靠的代码,还促进了持续集成和敏捷开发的实施。通过熟练掌握JUnit 4,开发者能够更自信地交付高质量...

    myEclipse下使用Junit

    本资源将指导读者如何在myEclipse中使用Junit,包括准备工作、使用Junit进行测试、Junit断言方法、Junit 4新特性等方面的内容。 一、准备工作 在myEclipse中使用Junit需要进行一些准备工作。首先,需要导入Junit的...

    半小时轻松搞定 JUnit4

    - **注解简介**:在JUnit4中,注解是一种特殊的Java语法特性,用于描述源代码的元数据,如测试方法或测试前后的设置。JUnit4中最常见的注解包括`@Test`、`@Before`、`@After`等。 - **注解的好处**:注解不仅简化了...

    Junit5用户文档

    JUnit5相对于之前的版本(如JUnit4)进行了重大的改进与扩展,它分为三个主要模块:JUnit Platform、JUnit Jupiter和JUnit Vintage。 - **JUnit Platform**:用于执行测试的引擎,不仅支持JUnit5格式的测试,还能...

    java单元测试包junit4.jar和hamcrest.core.jar

    JUnit4是JUnit系列的一个版本,它引入了许多新特性,如注解(annotations)、参数化测试、测试套件和定时器等。JUnit4允许开发者使用`@Test`注解标记测试方法,无需继承特定的基类。例如: ```java import org....

    Junit深入理解和学习的必备资料

    2. **断言(Assertions)**:在JUnit中,断言是用来验证程序预期结果是否符合实际结果的关键。例如,`assertEquals()`用于比较两个对象或值是否相等,`assertTrue()`和`assertFalse()`用于判断一个条件是否为真或假...

    Junit文档-myecliplise

    随着JUnit的发展,到了JUnit4版本,引入了一些新的特性,比如使用Hamcrest库的断言语法。Hamcrest提供了更丰富的匹配器,使得断言更加灵活和表达力更强。例如: 1. `assertThat(value, matcher)`:使用`assertThat`...

    JUnit报initializationError

    Hamcrest 是一个匹配器库,常用于 JUnit 的断言。如果测试涉及自定义的匹配器或者期望值,那么问题可能与 Hamcrest 相关。确保这些库的版本与所用 JUnit 版本兼容也很重要。 以下是可能导致 `initializationError` ...

    junit5.7 pdf

    ### JUnit 5.7: 深入...JUnit 5的推出不仅带来了一系列新的特性和改进,还为Java开发人员提供了一个强大且灵活的测试框架。通过对上述知识点的学习和实践,开发者可以充分利用JUnit 5的优势,提高测试的质量和效率。

    arquillian-junit-container.jar.zip

    4. **编写测试逻辑**: 利用 JUnit 的断言功能编写测试代码,验证应用程序的行为。 5. **运行测试**: 使用 Arquillian 提供的测试运行器执行测试,它会负责启动容器,部署应用,执行测试,然后清理环境。 通过这样...

    junit-4.9.jar

    在断言(Assertion)方面,JUnit 4.9提供了丰富的API,如`assertEquals()`、`assertNull()`等,帮助开发者准确验证程序的输出。同时,4.9版本还引入了更强大的`Hamcrest`匹配器,使断言表达更加灵活和语义化。 在...

    junit4.9b2

    JUnit 设计的目的就是有效地抓住编程人员写代码的意图,然后快速检查他们的代码是否与他们的意图相...提供了新的断言语法(Assertion syntax)——assertThat 提供了假设机制(Assumption) 提供了理论机制(Theory)

    hamcrest-1.3+junit-4.7+junit-4.8.2

    在 JUnit 4 中,可以直接引入 Hamcrest 来增强断言能力。通过 `import org.junit.Assert;` 引入 JUnit 的断言,而通过 `import org.hamcrest.MatcherAssert;` 或 `import static org.junit.Assert.assertThat;` 引入...

    ANT結合實際項目、JUNIT4測試詳細配置文件(可作為模板使用)

    JUnit4是JUnit测试框架的一个版本,它增强了早期版本的功能,提供了注解、测试套件、参数化测试等新特性。在JUnit4中,你可以: 1. **使用注解 (@Test)**: 标记测试方法,如`@Test`,Ant可以识别这些方法并执行它们...

    JUnit Test Files Maker v1.01

    3. 规定测试框架,如选择JUnit4还是JUnit5,因为这两者在语法上略有不同。 4. 指定需要生成测试用例的代码范围,例如特定的包、类或方法。 5. 点击生成,工具会自动生成测试代码,并将其保存到指定的位置。 6. 最后...

    strikt,kotlin的断言库.zip

    `strikt`作为Kotlin的断言库,它的目标是提供一套与Kotlin语法紧密结合、直观且易于使用的断言API。 **2. 使用strikt的益处** - **简洁的API**: `strikt`的API设计简洁明了,使得测试代码更加易读,减少了认知负担...

Global site tag (gtag.js) - Google Analytics