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 之前你可能这样做 :
		    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 虽然能够替代其他所有的断言语句, 但其他的断言语句也还可以继续使用。

示例代码下载
junit-assert.zip