第一分钟:声明测试方法
新建一个类,在要测试的方法上面添加@Test注解
1import org.junit.Test; 2import static org.junit.Assert.assertEquals; 3 4public class UserServiceTest{ 5 @Test 6 public void should_success_when_login() { 7 assertEqualis(5, 2+ 3); 8 } 9}
注意: 一下方法方将被忽略,不被识别为测试类:
JUnit发现一个非public方法,就会忽略它;
如果发现方法带有参数,就会忽略它;
如果方法返回非void,就会忽略它;
如果方法声明为static,就会忽略它;
如果方法没有JUnit的@Test注解,就会忽略它;
第二分钟:Junit生命周期
@BeforeClass 所有测试方法执行前执行
@Before 每个测试方法执行先执行
@Test 执行测试方法
@After 每个测试方法执行后执行
@AfterClass 所有测试方发执行后执行
1public void UserServiceTest{ 2 private User user; 3 @BeforeClass 4 public void register(){ 5 this.user = new User(); 6 } 7 8 @Before 9 public void setup() { 10 this.user.setUserName("Aaron"); 11 } 12 13 @Test 14 public void should_success_when_login_with_username() { 15 assertNotNull(this.user); 16 assertEquals(this.user.getUserName(), "Aaron"); 17 } 18 19 @After 20 public void resetUser() { 21 this.user.setUserName(""); 22 } 23 24 @AfterClass 25 public void destroyUser() { 26 this.user = null; 27 } 28}
第三分钟: JUnit断言
常用的断言如下:
assertEquals 断言两个对象是否相等。
assertArrayEquals 断言两个数组是否包含相同的元素。
assertTrue 断言语句为真。
assertFalse 断言语句为假。
assertNull 断言对象引用为空。
assertNotNull 断言对象引用不为空。
assertSame 断言两个对象引用指向同一个实例。
assertNotSame 断言两个对象引用指向不是同一个实例。
assertThat 断言对象满足制定的条件(后面会有例子)
第四分钟:JUnit验证抛出的异常信息
有时,代码中会主动抛出异常信息,例如:当用户登录时如果参数传递为空应该抛出控制指针异常,使用JUnit可以验证代码逻辑中当传入null时,是否真的抛出期望的异常信息。
1public class UserValidator{ 2 public void validateUserName(String name) { 3 if (String.isEmpty(name)){ 4 throw new ArgumentException(); 5 } 6 } 7} 8 9 10public class UserValidatorTest { 11 private UserValidator userValidator; 12 @BeforeClass 13 public void setup() { 14 userValidator = new UserValidator(); 15 } 16 17 @Test(expected=ArgumentException.class) 18 public void shouldThrowExceptionWhenUsernameIsEmpty() { 19 String username = ""; 20 userValidator.validateUserName(username); 21 } 22 23}
第五分钟:assertThat扩展
org.junit.Assert中的assertThat最为特别,他是一个钩子方法,允许程序员来扩展基本的断言或者使用第三方的匹配库。下面的例子是判断两个User对象是否相同。
1public class User{ 2 private String name; 3 4 public void setName(String name){ 5 this.name = name; 6 } 7 public String get 8 9 @Override 10 public boolean equals(Object obj) { 11 User user = (User)obj; 12 return name.equals(obj.getName()); 13 } 14 @Override 15 public int hashCode(){ 16 return 1; 17 } 18} 19 20 21public class UserTest{ 22 private User user; 23 24 @Before 25 public void setup() { 26 this.user = new User(); 27 this.user.setName("ab"); 28 } 29 30 31 @Test 32 public void shouldSuccessWhenNameEquals() { 33 User actualUser = new User(); 34 actualUser.setName(this.user.getName()); 35 assertThat(actualUser, is(this.user)); 36 } 37}