携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
在上一篇,关于Junit的异常测试中,就使用到了断言,对异常进行断言。本文将详细介绍junit中的各种断言方法.
断言是编写测试用例的核心实现方式,期望值是多少,测试的结果是多少,通过断言方法进行比对以此来判断测试是否通过。是测试用例通过与否的重要依据。
断言主要使用的是Assert类:
常用的断言方法如下:
| 方法 | 说明 |
|---|---|
| assertEquals(expected, actual) | 比较两个对象是否相等。类似于字符串比较使用的equals()方法 |
| assertNotEquals(first, second) | 比较两个对象是否不等。 |
| assertNull(object) | 判断对象是否为空。 |
| assertNotNull(object) | 判断对象是否不为空。 |
| assertArrayEquals(expecteds, actuals) | 比较两个数组是否相等。 |
| assertSame(expected, actual) | 比较两个对象的引用是否相等。类似于使用“==”比较两个对象 |
| assertNotSame(unexpected, actual) | 比较两个对象的引用是否不相等。类似于使用“!=”比较两个对象 |
| assertTrue(condition) | 比较运行结果是否为true。 |
| assertFalse(condition) | 比较运行结果是否为false。 |
| assertThat(actual, matcher) | 比较实际值是否满足指定的条件 |
| fail() | 让测试失败! |
| assertThrows(expectedThrowable,runnable) | runnable过程中抛出的异常是否为所期望的异常。 |
| assertThrows(message,expectedThrowable,runnable) | runnable过程中抛出的异常是否为所期望的异常。异常的提示信息是否为message |
一些常见的assert方法使用:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
public class AssertTest {
@Test
public void test() {
String str = null;
assertNull(str);
str = "hello Java!!";
assertNotNull(str);
long long1 = 2;
long long2 = 2;
assertEquals(long1, long2);
}
@Test
public void testAssertEqualsDouble() {
double double1 = 1.239;
double double2 = 1.237;
double delta = 0.002;
assertEquals(double1, double2, delta);
}
@Test
public void testAssertSame() {
String str1 = "hello world!!";
String str2 = "hello world!!";
assertSame(str2, str1);
}
@Test
public void testAssertNotSame() {
String str1 = "hello world!!";
String str3 = "hello Java!!";
assertNotSame(str1, str3);
}
}
上面是一些常用的assert方法的使用样例。需要注意的是,assertEquals方法还可以加delta,如testAssertEqualsDouble方法所示,判断两个double数值,可以允许一定的误差范围。
对于junit的断言,最有价值的是assertThat方法。但是这个方法在junit中已不再建议使用,而是使用hamcrest。
hamcrest的assertThat有什么好处呢? 我们可以看到,如果需要判断"hello word!"字符串中是否包含"hello!"这个字符串。显然是不包含,但是会出现错误提示,hamcrest能够得到更完善的体验。 代码如下:
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
public class AssertThatTest {
@Test
public void test() {
assertTrue("hello word!".contains("hello!"));
}
@Test
public void testAssertThat() {
assertThat("hello word!", containsString("hello!"));
}
}
上述两个方法,执行效果如下:
assertThat方法可以得到更详细的错误提示。对我们使用会更友好。
Hamcrest需要导入的包:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<type>jar</type>
<scope>test</scope>
</dependency>
通过MatcherAssert和Matchers配合会得到更灵活的体验。
- 字符相关匹配符
x
xx` equalTo匹配符断言被测的testedValue等于expectedValue, equalTo可以断言数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法
assertThat(testedValue, equalTo(expectedValue));
equalToIgnoringCase匹配符断言被测的字符串testedString 在忽略大小写的情况下等于expectedString
assertThat(testedString, equalToIgnoringCase(expectedString));
equalToIgnoringWhiteSpace匹配符断言被测的字符串testedString 在忽略头尾的任意个空格的情况下等于expectedString, 注意:字符串中的空格不能被忽略
assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);
containsString匹配符断言被测的字符串testedString包含子字符串subString
assertThat(testedString, containsString(subString) );
endsWith匹配符断言被测的字符串testedString以子字符串suffix结尾
assertThat(testedString, endsWith(suffix));
startsWith匹配符断言被测的字符串testedString以子字符串prefix开始
assertThat(testedString, startsWith(prefix));
- 一般匹配符
nullValue()匹配符断言被测object的值为null
assertThat(object,nullValue());
notNullValue()匹配符断言被测object的值不为null
assertThat(object,notNullValue());
is匹配符断言被测的object等于后面给出匹配表达式
assertThat(testedString, is(equalTo(expectedValue)));
is匹配符简写应用之一,is(equalTo(x))的简写,断言testedValue等于expectedValue
assertThat(testedValue, is(expectedValue));
is匹配符简写应用之二,is(instanceOf(SomeClass.class))的简写, 断言testedObject为Cheddar的实例\
assertThat(testedObject, is(Cheddar.class));
not匹配符和is匹配符正好相反,断言被测的object不等于后面给出的object*
assertThat(testedString, not(expectedString));
allOf匹配符断言符合所有条件,相当于“与”(&&)
assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );
anyOf匹配符断言符合条件之一,相当于“或”(||)*
assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );
- 数值相关匹配符
closeTo匹配符断言被测的浮点型数testedDouble在20.0¡À0.5范围之内*
assertThat(testedDouble, closeTo( 20.0, 0.5 ));
greaterThan匹配符断言被测的数值testedNumber大于16.0*
assertThat(testedNumber, greaterThan(16.0));
/** lessThan匹配符断言被测的数值testedNumber小于16.0*/\
assertThat(testedNumber, lessThan (16.0));
greaterThanOrEqualTo匹配符断言被测的数值testedNumber大于等于16.0*
assertThat(testedNumber, greaterThanOrEqualTo (16.0));
lessThanOrEqualTo匹配符断言被测的testedNumber小于等于16.0*
assertThat(testedNumber, lessThanOrEqualTo (16.0));
- 集合相关匹配符
hasEntry匹配符断言被测的Map对象mapObject含有一个键值为"key"对应元素值为"value"的Entry项
assertThat(mapObject, hasEntry("key", "value" ) );
hasItem匹配符表明被测的迭代对象iterableObject含有元素element项则测试通过
assertThat(iterableObject, hasItem (element));
hasKey匹配符断言被测的Map对象mapObject含有键值“key”
assertThat(mapObject, hasKey ("key"));
hasValue匹配符断言被测的Map对象mapObject含有元素值value
assertThat(mapObject, hasValue(value));