Hamcrest
一句话,如果你写单元测试,就应该用Hamcrest。
如今不写单元测试,你都不好意思说自己在做工程项目了。但你一般这么写断言呢?如果你还写成下面这样,我只能说你落伍了:
assertEquals(a, b);
请告诉我,哪个是执行结果,哪个是预期结果,不管你是怎样,反正大多数情况下,我是记不住的。所以,这个在只重功能不重可读性年代产生的API该更新了。于是,Hamcrest就是为了解决这样的问题而生的。
assertThat(a, is(b));//加入匹配规则。
很明显,前面一个是执行结果,后面一个是预期结果,当然这只是一个简单的例子。由于Hamcrest引入了matcher的概念(就是你看到的is部分【加入的匹配规则】),我们可以进行更多的组合:
assertThat(number, greaterThan(5));
assertThat(text, startsWith("Hello"));
assertThat(array, hasItem("World"));
Hamcrest如此好用,以至于JUnit已经将其吸纳进去。如果你现在用的JUnit是4.4之后的版本,那你已经有了Hamcrest。无需额外的配置,就可以拿过来用。
Hamcrest即是一个匹配器框架,以及增加了单元测试代码的可读性。
package com.jadyer.service;
import java.util.HashMap;
import java.util.Map;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
/**
* -----------------------------------------------------------------------------------------
* Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困难的测试
* 例如比较数值大小、测试对象类型、测试数组元素等等一系列的增强功能
* -----------------------------------------------------------------------------------------
* 本例中需要jar有两个:junit-4.10.jar、hamcrest-all-1.3.jar
* 但是注意:测试时可能报告这个异常java.lang.NoSuchMethodError: org.hamcrest.core.AllOf.allOf
* 这时把hamcrest.jar移到junit.jar前面即可,否则组合条件如allOf、anyOff等都会抛此异常
* -----------------------------------------------------------------------------------------
* Created by leesire<http://blog.see224.com/>
*/
public class TestByHamcrest {
/**
* 如果用的是JUnit-4.10,那么这里可以使用org.junit.Assert类,它提供了assertThat的功能
* 如果用的是JUnit低版本,比如MyEclipse6.5自带的JUnit-4.3.1则未提供Assert.assertThat
* 这时可以使用hamcrest-all-1.3.jar自带的org.hamcrest.MatcherAssert.assertThat()
*/
@Test
public void testHamcrest(){
//50是否大于20
Assert.assertThat(50, Matchers.greaterThan(20));
//50是否大于或等于50
Assert.assertThat(50, Matchers.greaterThanOrEqualTo(50));
//50是否即大于20又小于60(allOf方法类似于Java中的&&)
Assert.assertThat(50, Matchers.allOf(Matchers.greaterThan(20), Matchers.lessThan(60)));
//50是否大于20或小于40(anyOf方法类似于Java中的||)
Assert.assertThat(50, Matchers.anyOf(Matchers.greaterThan(20), Matchers.lessThan(40)));
//测试"abc.txt"是否以"txt"结束
Assert.assertThat("abc.txt", Matchers.endsWith("txt"));
Assert.assertThat("abc.txt", Matchers.startsWith("ab"));
Assert.assertThat("abc.txt", Matchers.containsString("c.t"));
Assert.assertThat(22+"aa", Matchers.hasToString("22aa"));
Assert.assertThat("http://jadyer.cn/", Matchers.instanceOf(String.class));
Assert.assertThat("http://jadyer.cn/", Matchers.notNullValue());
Assert.assertThat(null, Matchers.nullValue());
//针对集合的测试
String[] users = {"leesire", "Jadyer"};
Assert.assertThat(users, Matchers.hasItemInArray("leesire"));
Map<String, String> userMap = new HashMap<String, String>();
userMap.put("11", "leesire");
userMap.put("22", "Jadyer");
userMap.put("33", "http://blog.see224.com/");
Assert.assertThat(userMap, Matchers.hasKey("22"));
Assert.assertThat(userMap, Matchers.hasValue("http://blog.see224.com/"));
}
}