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/"));
}
}