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





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