JUnit,使用Hamcrest

上一篇 / 下一篇  2012-04-23 23:19:57 / 个人分类:JUnit

 

单元测试,也是进行预期结果与实际结果之间的比较。

单元测试因为是代码级别,所以比较的都是基本数据类型,字符串,数组,对象,集合,数字。

所谓比较就是将预期结果与实际结果进行匹配,Hamcrest就是一个库,包含了大量有用的匹配器。

下面这个例子就是使用基本的assertTrue,和Hamcrest中的匹配器来进行单元测试

测试一个数组,

这个数组实际包含,x,y,z,三个元素

我们预期是只要该数组包含one,two,three其中任何一个元素就代表测试通过。

很明显实际与预期是不符的,测试结果肯定是faile,下面是代码演示

import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.matchers.JUnitMatchers.hasItem;

public class HamcrestTest {

 private List<String> values;

 @Before
 public void setUpList() {
  values = new ArrayList<String>();
  values.add("x");
  values.add("y");
  values.add("z");
 }

 @Test
 public void testWithoutHamcrest() {
  assertTrue(values.contains("one") || values.contains("two")
    || values.contains("three"));
 }

 @Test
 public void testWithHamcrest() {
  assertThat(values, hasItem(anyOf(equalTo("one"), equalTo("two"),
   equalTo("three"))));
 }
}

 

编译后运行结果如下

E:\junit>java org.junit.runner.JUnitCore HamcrestTest
JUnit version 4.10
.E.E
Time: 0.015
There were 2 failures:
1) testWithoutHamcrest(HamcrestTest)

这里省略部分不重要的内容

2) testWithHamcrest(HamcrestTest)
java.lang.AssertionError:
Expected: a collection containing ("one" or "two" or "three")
     got: <[x, y, z]>

可以看到第二种方式使用Hamcrest,会输出比较详细的结果,预期("one" or "two" or "three")
但实际是<[x, y, z]>

Hamcrest还有很多匹配器适用不同的情况


TAG:

 

评分:0

我来说两句

Open Toolbar