咱们在写单元测试的时候,除了接口直接抛异常而致使该单元测试失败外,还有种是业务上的错误也表明着该单元测试失败。比如咱们在测试接口的时候,java
该接口返回是1表明成功,若是是0那就表明是失败的,这个时候能够考虑使用断言。git
1、原理咱们知道,咱们能够经过断言来校验测试用例的返回值和实际指望值进行比较,以此来判断测试是否经过。那咱们先来看下若是失败的状况下它的流程是怎么样的。github
对于断言而言,若是是错误最终都会进入下面的方法数组
static public void fail(String message) {less
if (message == null) {单元测试
throw new AssertionError();测试
}spa
throw new AssertionError(message);.net
}rest
很明显,这里有一个AssertionError对象,咱们来看下这个对象。
public class AssertionError extends Error {
//......
}
咱们很明显看到,它实继承是Error,而不是Exception。这说明什么,说明你没法经过try catch去捕获这个异常,只要进入断言fail中,必定会抛出异常。
2、Assert 源码这里只展现Assert源码中经常使用的方法,一些不经常使用或者过时的方法这里就不展现了。
public class Assert {
/**
* 结果 = 预期 则正确
*/
static public void assertEquals(Object expected, Object actual)
/**
* 结果 != 预期 则正确
*/
static public void assertNotEquals(Object unexpected, Object actual)
/**
* condition == true 则正确
*/
static public void assertTrue(boolean condition)
/**
* condition == false 则正确
*/
static public void assertFalse(boolean condition)
/**
* 永远是错误
*/
static public void fail()
/**
* 结果不为空 则正确
*/
static public void assertNotNull(Object object)
/**
* 结果为空 则正确
*/
static public void assertNull(Object object)
/**
* 两个对象引用 相等 则正确(上面至关于equels 这里相似于使用“==”比较两个对象)
*/
static public void assertSame(Object expected, Object actual)
/**
* 两个对象引用 不相等 则正确
*/
static public void assertNotSame(Object unexpected, Object actual)
/**
* 两个数组相等 则正确
*/
public static void assertArrayEquals(Object[] expecteds, Object[] actuals)
/**
* 这个单独介绍
*/
public static void assertThat(T actual, Matcher matcher)
}
注意 上面每个方法,都会有一个多一个参数的方法,这个参数为:String message。意思就是错误的状况下,咱们能够输出咱们自定义的message
示例
//这个就表示 结果 != 预期 的状况下,抛出的AssertionError 信息是咱们指定的message
static public void assertEquals(String message,Object expected, Object actual)
上面还有一个方法须要单独介绍,那就是assertThat方法。
3、assertThat方法你们习惯把assertThat理解成新断言,由于上面因此的功能方法,均可以经过assertThat这一个方法来实现。
一、基本语法
assertThat 的基本语法以下:
assertThat( [value], [matcher statement] );
value 是接口返回信息中,咱们想要测试的变量值
matcher statement: 是使用Hamcrest匹配符来表达的对前面变量所指望的值的声明,若是value值与matcher statement所表达的指望值相符,则测试成功,不然测试失败。
二、基本使用
字符串匹配符 String n = "xiao";
// containsString:字符串变量中包含指定字符串时,测试经过
assertThat(n, containsString("xiao"));
// startsWith:字符串变量以指定字符串开头时,测试经过
assertThat(n, startsWith("xi"));
// endsWith:字符串变量以指定字符串结尾时,测试经过
assertThat(n, endsWith("ao"));
// euqalTo:字符串变量等于指定字符串时,测试经过
assertThat(n, equalTo("xiao"));
// equalToIgnoringCase:字符串变量在忽略大小写的状况下等于指定字符串时,测试经过
assertThat(n, equalToIgnoringCase("xiao"));
// equalToIgnoringWhiteSpace:字符串变量在忽略头尾任意空格的状况下等于指定字符串时,测试经过
assertThat(n, equalToIgnoringWhiteSpace(" xiao "));
int匹配符int s = 1;
// allOf:全部条件必须都成立,测试才经过(大于1同时小于3)
assertThat(s, allOf(greaterThan(1), lessThan(3)));
// anyOf:只要有一个条件成立,测试就经过 (大于1或者小于2)
assertThat(s, anyOf(greaterThan(1), lessThan(2)));
// anything:不管什么条件,测试都经过
assertThat(s, anything());
// is:变量的值等于指定值时,测试经过
assertThat(s, is(2));
// not:和is相反,变量的值不等于指定值时,测试经过
assertThat(s, not(1));
double匹配符double d = 1D;
// closeTo:浮点型变量的值在3.0±0.5范围内,测试经过
assertThat(d, closeTo(3.0, 0.5));
// greaterThan:变量的值大于指定值时,测试经过
assertThat(d, greaterThan(3.0));
// lessThan:变量的值小于指定值时,测试经过
assertThat(d, lessThan(3.5));
// greaterThanOrEuqalTo:变量的值大于等于指定值时,测试经过
assertThat(d, greaterThanOrEqualTo(3.3));
// lessThanOrEqualTo:变量的值小于等于指定值时,测试经过
assertThat(d, lessThanOrEqualTo(3.4));
集合匹配符List list = new ArrayList();
// hasItem:Iterable变量中含有指定元素时,测试经过
assertThat(list, hasItem("xiao"));
Map m = new HashMap<>();
// hasEntry:Map变量中含有指定键值对时,测试经过
assertThat(m, hasEntry("xi", "xiao"));
// hasKey:Map变量中含有指定key时,测试经过
assertThat(m, hasKey("x"));
// hasValue:Map变量中含有指定value值时,测试经过
assertThat(m, hasValue("x"));
4、测试这里对于老断言,和新断言各测试5个。
一、老断言
示例public class TestServiceImplTest {
public void test1() {
String str = "xiao";
assertEquals(str, "xiaoniao");//不相等,因此错误
}
public void test2() {
assertFalse(Boolean.TRUE); //不是false,因此错误
}
public void test3() {
fail("直接是错误"); //直接是错误
}
public void test4() {
assertNull("xiao"); //不为空因此为错误
}
public void test5() {
assertNotNull("xiao");//不为空,因此为正确
}
}
这里应该只有第5个测试用例经过,前面4个都不经过的,咱们在来看实际运行结果
与实际相符,前面4个,测试用例不经过。并且能够看到第3个是咱们自定义错误信息,在控制台也打印出来了。
二、新断言
示例import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class TestServiceImplTest {
@Test
public void test1() {
String str = "xiao";
assertThat("这两字符串不相等",str, is("xiaoniao"));//不相等,因此错误
}
@Test
public void test2() {
int s = 1;
assertThat(s, anyOf(greaterThan(1), lessThan(2)));//知足 大于1或者小于2 因此正确
}
@Test
public void test3() {
double d = 1D;
assertThat(d, allOf(greaterThanOrEqualTo(1D),lessThan(2D)));//知足大于等于1 而且 小于2 因此正确
}
@Test
public void test4() { 郑州作无痛人流多少钱http://www.zzchfk.com/
List list = Lists.newArrayList("xiao","zhong","da");
assertThat(list, hasItem("xiao")); //包含xiao 因此正确
}
@Test
public void test5() {
Map map = new HashMap<>();
map.put("xiao", "xiao");
assertThat(map, hasKey("xiao")); //该map包含该key,因此正确 郑州无痛人流医院哪家好:http://www.zztjyyxb.com/
}
}
这里应该只有第1个测试用例不经过,其它都是经过的,咱们在来看实际运行结果
符合预期。
好了,整篇文章到这里就结束了,下面把该项目的具体代码放到github上。