ExpectedException:异常测试,在上一篇文章中介绍的@Test(expected=xxx)用法本质就是利用了这个Rule。相比之前的用法ExpectedException提供了灵活匹配规则,可以根据message、cause和异常的具体类型匹配。以下代码分别测试了message、异常类型和cause匹配:
public class ExpectedExceptionTest { @Rule public ExpectedException exp = ExpectedException.none(); @Test public void expectException() { exp.expect(IndexOutOfBoundsException.class); throw new IndexOutOfBoundsException("Exception method."); } @Test public void expectMessage() { exp.expectMessage("Hello World"); throw new RuntimeException("Hello World will throw exception."); } @Test public void expectCourse() { exp.expectCause(new BaseMatcher<IllegalArgumentException>() { public boolean matches(Object item) { return item instanceof IllegalArgumentException; } public void describeTo(Description description) { description.appendText("Expected Cause Error."); } }); Throwable cause = new IllegalArgumentException("Cause Test."); throw new RuntimeException(cause); } }
Timeout:这是一个很简单的Rule,用来控制method的执行时间。在上一篇文章中的@Test(timeout=xxx)就是由这个Rule实现的两者效果一致。值得一提的是Timeout用@ClassRule注解会有惊喜,因为作用域变成了Class所以它可以控制整个Test Class执行的耗时,也就是累计时间。
ExternalResource:这是一个抽象类,顾名思义这是一个管理测试需要的外部资源的类。一般情况下多使用@ClassRule来修饰,使用场景包括准备数据、启动服务器、创建测试文件等操作,下面代码模拟了为测试准备数据的情形:
@ClassRule public static ExternalResource external = new ExternalResource() { protected void before() throws Throwable { System.out.println("Perparing test data."); System.out.println("Test data is Ready!"); } protected void after() { System.out.println("Cleaning test data."); } }; @Test public void method1() { System.out.println("Test Method first executing..."); } @Test public void method2() { System.out.println("Test Method second executing..."); } @Test public void method3() { System.out.println("Test Method thrid executing..."); }执行后输出结果:
@ClassRule public static TemporaryFolder folderCreater = new TemporaryFolder(); @Before public void before() throws IOException { folderCreater.create(); } public void createFolder() throws IOException { File folder = folderCreater.newFolder(); File file = folderCreater.newFile("fileName.txt"); //do something... }TestWatcher:提供了一个用于监视测试执行的基类。TestWatcher及其子类不会改变测试的任何行为,提供了succeeded、failded、skipped、starting、finished方法监控一个测试方法生命周期的各个阶段,所有方法都包含一个org.junit.runner.Description类型的参数描述了当前执行的测试。
public class TestName extends TestWatcher { private String fName; @Override protected void starting(Description d) { fName = d.getMethodName(); } /** * @return the name of the currently-running test method */ public String getMethodName() { return fName; } }
以上就是TestName的所有代码,它提供了一个getMethodName的方法你可以在测试方法的任何地方调用这个方法获取当前的测试方法名称(虽然没什么用),这个方法是通过重载TestWatcher的starting方法实现的。
@RunWith(Theories.class) public class AssumeTest { @DataPoints public static String[] names = {"LiLei", "HanMeiMei"}; @DataPoints public static int[] ages = {10, -2, 12}; @Theory public void printAge(String name, int age) { Assume.assumeTrue(age > 0); System.out.println(String.format("%s's Name is %s.", name, age)); } }打印结果中排除了负数的年龄,并且JUnit测试通过:
Assert是JUnit提供的断言类,用于常用的测试结果验证。提供的功能和方法都比较简单实用,这里只用列表简单介绍:
AssertTrue、AssertFalse:结果的true、false。
AssertThat:使用Matcher做自定义的校验。
AssertEquals、AssertNotEquals:判断两个对象是否相等。
AssertNull、AssertNotNull:判断对象是否为空。
AssertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断。
AssertArrayEquals:判断两个数组是否相等。
至此总结了JUnit4的主要功能的使用方法,后续计划再有一篇博文记录自己在阅读JUnit4原码的一些收获和感想。