java單元測試——JUnit4Hamcrest


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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章