assertThat
一种插入机制,语法如下:
assertThat([value], [matcher statement]);
例如:
assertThat(x, is(3));
assertThat(x, is(not(4)));
assertThat(responseString, either(containsString("color")).or(containsString("colour")));
assertThat(myList, hasItem("3"));
这个语法的优点:
更加易读易写:assertThat 以“主体+动词+对象”的思维形式,比如:"x is 3";而不是像assertEquals一样,采用“动词+对象+主体”的思维形式,比如:“equals 3 x"
易于联合使用:任何匹配描述都可以这样用:not(s)用来否定;either(s).or(t)用来联合;each(s)用来收藏;afterFiveSeconds(s)用来在用户中联合
其中,易读性的优点,可比较下列代码:
assertTrue(responseString.contains("color") || responseString.contains("colour")); // ==> failure message: // java.lang.AssertionError: assertThat(responseString, anyOf(containsString("color"), containsString("colour"))); // ==> failure message: // java.lang.AssertionError: // Expected: (a string containing "color" or a string containing "colour") // got: "Please choose a font"
我们决定在Junit中直接加入 这个API,它是个可扩展且易读的语法,而且它能够实现新功能。原有的插入语法永远不会过时,开发们还是会继续用assertEquals, assertTrue等等。assertThat语法的第二个参数是Matcher,通过静态导入的方式使程序包含我们想用的Matchers。用法如下:
import static org.hamcrest.CoreMatchers.is;
或者
import static org.hamcrest.CoreMatchers.*;
为了兼容更多的可能的matchers,我们决定加入来自hamcrest-core和Hamcrest project的类,第三方类被加入JUnit这还是第一次 。
JUnit一般自带几个matchers , 定义在org.hamcrest.CoreMatchers
和 org.junit.matchers.JUnitMatchers 。
为了应用更多,请参考下载完整的hamcrest 包:
- Hamcrest page http://code.google.com/p/hamcrest/wiki/Tutorial
- Hamcrest Java on GitHub: https://github.com/hamcrest/JavaHamcrest
对于如何比较字符串和数组以及显示他们的具体区别,JUnit给予了特殊支持。虽然这个还不能用assertThat来实现,但我们希望在未来的发布中能加入这两个插入方法。
JUnit Matchers
JUnit includes useful matchers for use with the assertThat method, but they are not currently included in the basic CoreMatchers class from hamcrest.
- Javadoc JUnitMatchers http://junit.org/junit4/javadoc/latest/org/junit/matchers/JUnitMatchers.html
Hamcrest CoreMatchers
Useful Hamcrest CoreMatchers are included in the JUnit distribution
- JavaDoc Hamcrest CoreMatchers http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
Thirdparty Matchers
Other, potentially Matchers out there include