单元测试,也是进行预期结果与实际结果之间的比较。
单元测试因为是代码级别,所以比较的都是基本数据类型,字符串,数组,对象,集合,数字。
所谓比较就是将预期结果与实际结果进行匹配,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还有很多匹配器适用不同的情况