1.0 前言
**断言(assertion)**是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
1.1 JUnit assert断言
这里我们直接上例子
importstaticorg.junit.Assert.assertArrayEquals;importstaticorg.junit.Assert.assertEquals;importstaticorg.junit.Assert.assertFalse;importstaticorg.junit.Assert.assertNotNull;importstaticorg.junit.Assert.assertNotSame;importstaticorg.junit.Assert.assertNull;importstaticorg.junit.Assert.assertSame;importstaticorg.junit.Assert.assertThat;importstaticorg.junit.Assert.assertTrue;importjava.util.Arrays;importorg.junit.Test;publicclassAssertTests{@TestpublicvoidtestAssertArrayEquals(){byte[] expected ="trial".getBytes();byte[] actual ="trial".getBytes();assertArrayEquals("failure - byte arrays not same", expected, actual);}@TestpublicvoidtestAssertEquals(){assertEquals("failure - strings are not equal","text","text");}@TestpublicvoidtestAssertFalse(){assertFalse("failure - should be false",false);}@TestpublicvoidtestAssertNotNull(){assertNotNull("should not be null",newObject());}@TestpublicvoidtestAssertNotSame(){assertNotSame("should not be same Object",newObject(),newObject());}@TestpublicvoidtestAssertNull(){assertNull("should be null",null);}@TestpublicvoidtestAssertSame(){Integer aNumber =Integer.valueOf(768);assertSame("should be same", aNumber, aNumber);}@TestpublicvoidtestAssertTrue(){assertTrue("failure - should be true",true);}}
接下来我们来介绍下他们
方法介绍assertEquals(expected, actual)检查断言两个值相等assertTrue(condition)检查条件为真assertFalse(condition)检查条件为假assertNotNull(object)检查不为空assertNull(object)检查为空assertNotSame(expected, actual)检查两个相关对象是否不指向同一个对象assertSame(expected, actual)检查两个相关对象是否指向同一个对象assertArrayEquals(expectedArray, resultArray)检查两个数组是否相等
1.2 assertThat断言
1.2.0 assertThat介绍
JUnit 4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想
1.2.1 一般匹配符断言
方法介绍assertThat(“myValue”, allOf(startsWith(“my”), containsString(“Val”)))allOf匹配符表明如果接下来的所有条件必须都成立测试才通过,相当于“与”(&&)assertThat(“myValue”, anyOf(startsWith(“foo”), containsString(“Val”)))anyOf匹配符表明如果接下来的所有条件只要有一个成立则测试通过,相当于“或”(assertThat( “myValue”, anything() )anything匹配符表明无论什么条件,永远为trueassertThat( “myValue”, is( “myValue” ) )is匹配符表明如果前面待测的值等于后面给出的值,则测试通过assertThat( “myValue”, not(“foo”))not匹配符和is匹配符正好相反,表明如果前面待测的值不等于后面给出的值,则测试通过
1.2.2 字符串相关匹配符
方法介绍assertThat(“myStringOfNote”, containsString(“ring”))containsString匹配符表明如果测试的字符串包含子字符串则测试通过assertThat(“myStringOfNote”, endsWith(“Note”))endsWith匹配符表明如果测试的字符串以子字符串结尾则测试通过assertThat(“myStringOfNote”, startsWith(“my”))startsWith匹配符表明如果测试的字符串以子字符串开始则测试通过assertThat(“foo”, equalTo(“foo”))equalTo匹配符表明如果测试的数据等于则测试通过,equalTo可以测试数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法assertThat(“Foo”, equalToIgnoringCase(“FOO”))equalToIgnoringCase匹配符表明如果测试的字符串在忽略大小写的情况下等于则测试通过assertThat(" my\tfoo bar “, equalToIgnoringWhiteSpace(” my foo bar"))equalToIgnoringWhiteSpace匹配符表明如果测试的字符串在忽略头尾的任意个空格的情况下等于则测试通过,注意:字符串中的空格不能被忽略
1.2.3 数值相关匹配符
方法介绍assertThat(1.03, is(closeTo(1.0, 0.03)))closeTo匹配符表明如果所测试的浮点型数在1.0±0.03范围之内则测试通过assertThat(2, greaterThan(1))greaterThan匹配符表明如果所测试的数值大于1则测试通过assertThat(1, lessThan(2))lessThan匹配符表明如果所测试的数值小于2则测试通过assertThat(1, greaterThanOrEqualTo(1))greaterThanOrEqualTo匹配符表明如果所测试的数值大于等于1则测试通过assertThat(1, lessThanOrEqualTo(1))lessThanOrEqualTo匹配符表明如果所测试的数值小于等于1则测试通过
1.2.4 集合相关匹配符
方法介绍assertThat(myMap, hasEntry(“bar”, “foo”))hasEntry匹配符表明如果测试的Map对象含有一个键值为"bar"对应元素值为"foo"的Entry项则测试通过ssertThat(Arrays.asList(“foo”, “bar”), hasItem(startsWith(“ba”)))hasItem匹配符表明如果测试的迭代对象含有元素以ba开头项则测试通过assertThat(myMap, hasKey(“bar”))hasKey匹配符表明如果测试的Map对象含有键值“bar”则测试通过assertThat(myMap, hasValue(“foo”))hasValue匹配符表明如果测试的Map对象含有元素值“foo”则测试通过
1.2.5 示例
Cs.java
importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;publicclassCs{publicintadd(int a,int b){return a + b;}publicdoublediv(double a,double b){return a / b;}publicStringgetName(String name){return name;}publicList<String>getList(String item){List<String> l =newArrayList<String>();
l.add(item);return l;}publicMap<String,String>getMap(String key,String value){Map<String,String> m =newHashMap<String,String>();
m.put(key, value);return m;}}
CsTest.java
importstaticorg.hamcrest.MatcherAssert.*;importstaticorg.hamcrest.Matchers.*;importjava.util.List;importjava.util.Map;importorg.junit.Test;publicclassCsTest{@TestpublicvoidtestAdd(){//一般匹配符 int s =newCs().add(1,1);//allOf:所有条件必须都成立,测试才通过 assertThat(s,allOf(greaterThan(1),lessThan(3)));//anyOf:只要有一个条件成立,测试就通过 assertThat(s,anyOf(greaterThan(1),lessThan(1)));//anything:无论什么条件,测试都通过 assertThat(s,anything());//is:变量的值等于指定值时,测试通过 assertThat(s,is(2));//not:和is相反,变量的值不等于指定值时,测试通过 assertThat(s,not(1));//数值匹配符 double d =newCs().div(10,3);//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));//字符串匹配符 String n =newCs().getName("Magci");//containsString:字符串变量中包含指定字符串时,测试通过 assertThat(n,containsString("ci"));//startsWith:字符串变量以指定字符串开头时,测试通过 assertThat(n,startsWith("Ma"));//endsWith:字符串变量以指定字符串结尾时,测试通过 assertThat(n,endsWith("i"));//euqalTo:字符串变量等于指定字符串时,测试通过 assertThat(n,equalTo("Magci"));//equalToIgnoringCase:字符串变量在忽略大小写的情况下等于指定字符串时,测试通过 assertThat(n,equalToIgnoringCase("magci"));//equalToIgnoringWhiteSpace:字符串变量在忽略头尾任意空格的情况下等于指定字符串时,测试通过 assertThat(n,equalToIgnoringWhiteSpace(" Magci "));//集合匹配符 List<String> l =newCs().getList("Magci");//hasItem:Iterable变量中含有指定元素时,测试通过 assertThat(l,hasItem("Magci"));Map<String,String> m =newCs().getMap("mgc","Magci");//hasEntry:Map变量中含有指定键值对时,测试通过 assertThat(m,hasEntry("mgc","Magci"));//hasKey:Map变量中含有指定键时,测试通过 assertThat(m,hasKey("mgc"));//hasValue:Map变量中含有指定值时,测试通过 assertThat(m,hasValue("Magci"));}}
在这里大家可能会出现一些问题:
那是因为我们之前导入了eclipse内置的jar包,eclipse内置的junit的jar包有脏东西,会导致包冲突
解决办法:
去下个纯净版的安装上就行了
下载连接:
版权归原作者 还梦呦 所有, 如有侵权,请联系我们删除。