JUnit测试一个类:
package com.junit4;
public class T {
public int add(int x, int y) {
return x + y;
}
public int devide(int x, int y) {
return x / y;
}
}
eclipse创建JUuit测试类(用JUnit Test Case创建,创建时使用eclipse自带的JUnit jar包):
package com.junit4.test;
//静态引入(也就是说,静态引入一个类,就可以直接使用这个类中的静态方法,而不需要类名了)
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.junit4.T;
public class TTest {
public TTest() {
System.out.println("TTest");
}
// 每一个测试方法之前运行
@Before
public void before() {
System.out.println("before");
}
// 每一个测试方法之后运行
@After
public void after() {
System.out.println("after");
}
// 所有测试开始之前运行[因为是这个类被初始化之前运行,所以这个方法是static]
// 当需要取得一些很耗费时间的资源或者搭载一些很耗费时间的环境时,就会用到BeforeClass,比如:链接数据库
@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}
// 所有测试结束之后运行
// 当需要把这些资源释放掉或环境卸载掉时,就会用到AfterClass,比如:关闭一些数据库链接
@AfterClass
public static void afterClass() {
System.out.println("afterClass");
}
@Test
public void testAdd() {
int z = new T().add(4, 6);
assertEquals(10, z);
assertEquals("结果不等于10", 10, z);
}
// 在JUnit测试领域,有一句著名的话:keeps the bar green to keeps the code clean.
// 忽略该测试方法
@Ignore
// 期望代码抛出ArithmeticException异常,并且要在100毫秒内运行完毕
@Test(expected = java.lang.ArithmeticException.class, timeout = 100)
public void testDevide() {
new T().devide(4, 0);
}
}
运行结果:
beforeClass
TTest
before
after
afterClass
放弃旧的断言,使用hamcrest断言(这里就要用到assertThat方法,该方法最后一个参数使用hamcrest的匹配方法)
示例:
//n是不是大于1并且小于15
assertThat(n, allOf(greaterThan(1), lessThan(15)));
//n是不是大于16或者小于8
assertThat(n, anyOf(greaterThan(16), lessThan(8)));
//n是任何值
assertThat(n, anything());
//n是不是和nExpected相等[equalTo比较两个对象,is比较两个值]
assertThat(n, equalTo(nExpected));
//str是不是test字符串
assertThat(str, is("test"));
//str是不是不是test字符串
assertThat(str, not("test"));
//str是不是包含test字符串
assertThat(str, containsString("test"));
//str是不是以test字符串结尾
assertThat(str, endsWith("test"));
//str是不是以test字符串开头
assertThat(str, startsWith("test"));
//str忽略大小写后是不是和test字符串相等
assertThat(str, equalToIgnoringCase("test"));
//str忽略空格字符后是不是和test字符串相等
assertThat(str, equalToIgnoringWhiteSpace("test"));
//d是不是接近3.0,误差不超过0.3
assertThat(d, closeTo(3.0, 0.3));
//d是不是大于3.0
assertThat(d, greaterThan(3.0));
//d是不是小于3.0
assertThat(d, lessThan (10.0));
//d是不是大于等于3.0
assertThat(d, greaterThanOrEqualTo (5.0));
//d是不是小于等于3.0
assertThat(d, lessThanOrEqualTo (16.0));
//map是不是有test键对应的test值
assertThat(map, hasEntry("test", "test"));
//map是不是有test键
assertThat(map, hasKey ("test"));
//map是不是有test值
assertThat(map, hasValue ("test"));
//list是不是有test这一项
assertThat(list, hasItem ("test"));
具体操作:
引入两个jar包:hamcrest-core-1.3.jar、hamcrest-library-1.3.jar
package com.junit4.test;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import org.junit.Test;
import com.junit4.T;
public class TTest {
@Test
public void testAdd(){
int z = new T().add(4, 6);
// 这个方法可以代替其他所有的assert*方法
assertThat("结果不正确", z, is(10));
assertThat("结果不正确", z, allOf(greaterThan(5), lessThan(20)));
}
}
运行之后出行异常:
java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:776)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:488)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
……
这个原因是:创建时使用eclipse自带的JUnit jar包和引入的hamcrest jar包使用的不是同一个ClassLoader
解决办法:删掉eclipse自带的JUnit jar包,引入JUnit官方下载的jar包
Error和Failures的区别:
Error是程序本身出错,而Failures是测试失败,程序在没有Error的前提下,才能进行Failures测试,比如:int x = 8/0,这个时候就是程序本身出错了,而把代码assertEquals("结果不等于10", 10, z);改成assertEquals("结果不等于9", 9, z);这个时候就是测试失败了。