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 虽然能够替代其他所有的断言语句, 但其他的断言语句也还可以继续使用。
示例代码下载