Junit Assert
来源:原创 发布时间:2015-04-15 归档:junit
环境 :
JDK 7
Maven 3
Junit 4.11
Eclipse Luna
Assert 是 Junit 提供的一套断言机制, 用于检查测试的结果与预期结果是否吻合, 以快速检查开发的代码功能与意图是否匹配。
Basic Usage
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
public class AssertUsageTest {
private static Object obj0 = new String("aa");
private static Object obj1 = obj0;
private static Object obj2 = obj0;
private static Object obj3 = new String("bb");
private static int[] array1 = {1, 2, 3, 4, 5};
private static int[] array2 = {1, 2, 3, 4, 5};
@Test
public void testBasicUsage() {
/** 断言两个对象 equals */
assertEquals(obj1, obj2);
/** 断言两个对象不 equals */
assertNotEquals(obj2, obj3);
/** 断言条件为真 */
assertTrue(obj1.toString().length() == 2);
/** 断言条件为假 */
assertFalse(obj1.toString().length() == 3);
/** 断言对象为 null */
assertNull(null);
/** 断言对象为非 null */
assertNotNull(obj1);
/** 断言两个变量引用的是同一个对象 */
assertSame(obj1, obj2);
/** 断言两个变量引用的不是同一个对象 */
assertNotSame(obj2, obj3);
/** 断言两个数组的元素按索引依次 equals */
assertArrayEquals(array1, array2);
}
}
assertThat
Assert.assertThat 是 Junit 4.4 开始提供的新的断言语法。Junit 4.4 开始引入了 Hamcrest 匹配机制, Hamcrest 是一个测试的框架,它提供了一套通用的匹配符,可以更加的灵活和准确的设定测试的条件。
例如, 现有 imgUrl = "http://lychie.github.io/images/articles/maven/15040723/eclipse-maven.png", 如果想检查 imgUrl 是以 http 开头, 并且以 .png 结尾的串。Junit 4.4 之前你可能这样做 :
例如, 现有 imgUrl = "http://lychie.github.io/images/articles/maven/15040723/eclipse-maven.png", 如果想检查 imgUrl 是以 http 开头, 并且以 .png 结尾的串。Junit 4.4 之前你可能这样做 :
assertTrue(imgUrl.startsWith("http") && imgUrl.endsWith(".png"));
现在你可以这样做 :
assertThat(imgUrl, is(allOf(startsWith("http"), endsWith(".png"))));
再如, 如果想检查 imgUrl 是以 .png 或 .jpg 结尾的串, JUnit 4.4 之前你可能这样做 :
assertTrue(imgUrl.endsWith(".png") || imgUrl.endsWith(".jpg"));
现在你可以这样做 :
assertThat(imgUrl, is(anyOf(endsWith(".png"), endsWith(".jpg"))));
Assert.assertThat 可以替代所有其他的断言语句, 并且语义更加清晰, 代码风格也可以得到统一。
@Test
public void testAssertThatUsage() {
/**
* 替代 assertEquals
*/
assertThat(obj1, equalTo(obj2));
/**
* 替代 assertEquals
*/
assertThat(obj1, is(equalTo(obj2)));
/**
* 替代 assertNotEquals
*/
assertThat(obj2, not(obj3));
/**
* 替代 assertNotEquals
*/
assertThat(obj2, not(equalTo(obj3)));
/**
* 替代 assertTrue
*/
assertThat(obj1.toString().length(), is(2));
/**
* 替代 assertFalse
*/
assertThat(obj1.toString().length(), is(not(3)));
/**
* 替代 assertNull
*/
assertThat(null, is(nullValue()));
/**
* 替代 assertNotNull
*/
assertThat(obj1, is(notNullValue()));
/**
* 替代 assertSame
*/
assertThat(obj1, is(sameInstance(obj2)));
/**
* 替代 assertNotSame
*/
assertThat(obj2, is(not(sameInstance(obj3))));
/**
* 替代 assertArrayEquals
*/
assertThat(array1, is(equalTo(array2)));
}
可以看到 Hamcrest 非常灵活, Matcher 可以嵌套 Matcher, 可以组合出多种不同的测试场景。assertThat 虽然能够替代其他所有的断言语句, 但其他的断言语句也还可以继续使用。
示例代码下载