本文将进一步探究Rule的应用,展示如何使用Rule来替代@BeforeClass,@AfterClass,@Before和@After的功能。
在上一篇中提到,可以使用Rule替代现有的大部分Runner扩展,而且也不提倡对Runner中的withBefores(),withAfters()等方法进行扩展。本文将介绍如何使用Rule去实现@Before,@After和@BeforeClass的相同功能。
1. BaseRule
首先要创建一个较通用的TestRule实现BaseRule,它会释放出两个扩展点,一个在执行测试方法之前,before();另一个在执行测试方法之后after()。下面是该类的代码:
package com.bijian.study; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; public abstract class BaseRule implements TestRule { @Override public Statement apply(Statement base, Description description) { return new RuleStatement(base, description); } private class RuleStatement extends Statement { private Statement base = null; private Description description = null; private RuleStatement(Statement base, Description description) { this.base = base; this.description = description; } @Override public void evaluate() throws Throwable { before(base, description); try { base.evaluate(); } finally { after(base, description); } } } protected void before(Statement base, Description description) throws Throwable { } protected void after(Statement base, Description description) { } }
如果对JUnit4的源代码略有认知,可能会发现BaseRule与JUnit4提供的TestRule实现ExternalResource代码相似。关键的不同之处是,BaseRule中的before()与after()方法都提供了Statement与Description类型的参数,这使得它能够完成更复杂的工作。
2. CalculatorTest
本文使用的CalculatorTest将不使用@BeforeClass,@Before和@After,而会创建两个BaseRule的实例:一个用于替代@BeforeClass和@AfterClass(本系列目前还未使用过@AfterClass),另一个则替代@Before和@After。
package com.bijian.study; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.junit.Assert; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class CalculatorTest { private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS"); private static Calculator calculator = null; @ClassRule public static BaseRule classRule = new BaseRule() { protected void before(Statement base, Description description) throws Throwable { calculator = new Calculator(); }; }; @Rule public BaseRule rule = new BaseRule() { protected void before(Statement base, Description description) throws Throwable { printBeforeLog(description); }; protected void after(Statement base, Description description) { printAfterLog(description); }; private void printBeforeLog(Description description) { TestLogger testLogger = description.getAnnotation(TestLogger.class); if (testLogger != null) { StringBuilder log = new StringBuilder(format.format(new Date())); log.append(" ").append(description.getClassName()).append("#") .append(description.getMethodName()).append(": ") .append(testLogger.log()); System.out.println(log.toString()); } } private void printAfterLog(Description description) { StringBuilder log = new StringBuilder(format.format(new Date())); log.append(" ").append(description.getClassName()).append("#") .append(description.getMethodName()).append(" end"); System.out.println(log.toString()); } }; @Test @TestLogger(log = "a simple division") public void simpleDivide() { int value = calculator.divide(8, 2); Assert.assertTrue(value == 4); } @Test(expected = ArithmeticException.class) @TestLogger(log = "divided by zero, and an ArithmeticException thrown.") public void dividedByZero() { calculator.divide(8, 0); } }
值得注意的是,classRule是静态变量,它使用@ClassRule Annotation,将替代@BeforeClass和@AfterClass;而rule是成员变量,它使用@Rule Annotation,将替代@Before和@After。与之前文章不同的是,此处不仅会在执行测试方法之前打印指定内容的日志(printBeforeLog()),还会在执行测试方法之后打印一条固定格式的日志(printAfterLog()),用于指示该测试方法已经执行完毕了。执行结果如下所示:
2014-09-24_00:05:41_375 com.bijian.study.CalculatorTest#simpleDivide: a simple division 2014-09-24_00:05:41_375 com.bijian.study.CalculatorTest#simpleDivide end 2014-09-24_00:05:41_375 com.bijian.study.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown. 2014-09-24_00:05:41_375 com.bijian.study.CalculatorTest#dividedByZero end
3. 小结
使用Rule可以替代绝大部分的Runner扩展,而且特定的Rule实现可以被复用,也易于添加或移除Rule实例,这些都大大地提高了灵活性。值得注意地是,本文虽然使用Rule代替了@BeforeClass,@AfterClass,@Before和@After的功能,但并不意味着就应当这么做。就我个人的看法,将传统的Fixture功能交由@BeforeClass,@AfterClass,@Before和@After实现,仍然是一种不错的选择。
文章来源:http://www.blogjava.net/jiangshachina/archive/2012/01/04/367802.html
相关推荐
NULL 博文链接:https://bijian1013.iteye.com/blog/2119786
赠送jar包:junit-jupiter-api-5.4.2.jar; 赠送原API文档:junit-jupiter-api-5.4.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.4.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.4.2.pom; ...
junit-libs:junit测试包
使用Junit4.12需要用的两个包,官网在国内无法下载
使用JUnit 4进行单元测试时,测试程序一直运行失败,报method initializationerror not found错误,添加以下几个jar包即可解决问题,希望可以帮助大家。
需要在build.gradle里面添加dependencies {testCompile 'junit:junit:4.12'}
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
赠送jar包:junit-jupiter-engine-5.8.2.jar; 赠送原API文档:junit-jupiter-engine-5.8.2-javadoc.jar; 赠送源代码:junit-jupiter-engine-5.8.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-engine-...
使用Junit4.12需要用的两个包,官网在国内无法下载 使用Junit4.12需要用的两个包,官网在国内无法下载
赠送jar包:junit-jupiter-api-5.8.0-M1.jar; 赠送原API文档:junit-jupiter-api-5.8.0-M1-javadoc.jar; 赠送源代码:junit-jupiter-api-5.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.8.0-...
赠送jar包:junit-jupiter-api-5.8.2.jar; 赠送原API文档:junit-jupiter-api-5.8.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.8.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.8.2.pom; ...
junit-vintage-engine-5.6.2.jarjunit-vintage-engine-5.6.2.jarjunit-vintage-engine-5.6.2.jar
本人小白,开始学习Android,记录自己的错误瞬间,大神不要喷我,哈哈! 安装好android studio后,测试...如果不在意的话,可以不下载它,在module的build.gradle中dependencies模块把加载junit的testCompile ‘junit:j
JUnit 4所需system-rules.jar依赖包,主要包含:system-rules-1.16.1.jar,system-rules-1.17.1.jar,system-rules-1.18.0.jar
赠送jar包:junit-4.12.jar; 赠送原API文档:junit-4.12-javadoc.jar; 赠送源代码:junit-4.12-sources.jar; 包含翻译后的API文档:junit-4.12-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:...
赠送jar包:junit-jupiter-api-5.5.2.jar; 赠送原API文档:junit-jupiter-api-5.5.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.5.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.5.2.pom; ...
赠送jar包:junit-jupiter-engine-5.8.0-M1.jar; 赠送原API文档:junit-jupiter-engine-5.8.0-M1-javadoc.jar; 赠送源代码:junit-jupiter-engine-5.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-...
Junit4练习:使用JUnit4测试进行简单练习
junit-4.11.jar 下载成功后解压,jar包在文件夹里。 官方下载,放心使用