转载自:
http://www.blogjava.net/jiangshachina/archive/2011/12/24/366801.html
在上一篇文章《探索JUnit4扩展:扩展Runner》中,讨论了一种扩展JUnit4的方式,即,直接修改Test Runner的实现(BlockJUnit4ClassRunner)。但这种方法显然不便于灵活地添加或删除扩展功能。本文将使用JUnit4.7才开始引入的扩展方式--Rule来实现相同的扩展功能。(2010.12.25最后更新)
1. Rule
Rule是JUnit4.7才开始提供的一种扩展方式,它能够替代大部分已有的Runner扩展。JUnit包含两种Rule Annotation:@ClassRule与@Rule。@ClassRule应用于测试类中的静态变量,而@Rule应用于成员变量;相同地是,这些变量必须是TestRule接口的实例,且访问修饰符必须为public。
在上篇博文中,对BlockJUnit4ClassRunner进行了扩展,被扩展的方法是methodBlock,现在我们来看看该方法体中的代码,
Object test;
try {
test= new ReflectiveCallable() {
@Override
protected Object runReflectiveCall() throws Throwable {
return createTest();
}
}.run();
} catch (Throwable e) {
return new Fail(e);
}
Statement statement= methodInvoker(method, test);
statement= possiblyExpectingExceptions(method, test, statement);
statement= withPotentialTimeout(method, test, statement);
statement= withBefores(method, test, statement);
statement= withAfters(method, test, statement);
statement= withRules(method, test, statement);
return statement;
}
但在BlockJUnit4ClassRunner中,possiblyExpectingExceptions(),withPotentialTimeout(),withBefores()和withAfters()都已经被标注为过时,JUnit建议使用Rule来替代这些方法的功能。
2. TestLogRule
如第1节所述,Rule Annotation要作用于TestRule接口的实例,那么就要先创建一个TestRule的实现类。
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");
@Override
public Statement apply(Statement base, 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());
}
return base;
}
}
如上所示,TestLogRule与上篇博文中的LoggedRunner的代码有许多相同之处,功能则都是打印出指定的日志,每行日志又以当时的执行时间与完整方法名作为前缀。
3. 使用Rule的CalculatorTest
下面是新的测试类CalculatorTest,它将不使用BlockJUnit4ClassRunner的扩展LoggedRunner作为测试执行器,所以该类没有使用@RunWith(LoggedRunner.class),那么在执行该测试类时仍然会使用BlockJUnit4ClassRunner。
private static Calculator calculator = null;
@Rule
public TestLogRule testLogRule = new TestLogRule();
@BeforeClass
public static void createCalculator() {
calculator = new Calculator();
}
@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);
}
}
与上篇博文中的CalculatorTest相比,本文中的CalculatorTest除了没有使用LoggedRunner之外,还多了两行代码
public TestLogRule testLogRule = new TestLogRule();
在执行单元测试方法之前,BlockJUnit4ClassRunner会调用TestRule/TestLogRule中的apply()方法,即,会先打印出日志内容。
4. 小结
使用Rule对JUnit进行扩展,能够避免对默认Runner的扩展,为测试类添加或移除Rule十分方便,而且Rule实现类本身也能很方便地被复用。在下一篇博文中将进一步探索Rule的应用。
相关推荐
标题“探索JUnit4扩展:使用Rule”涉及到的是Java单元测试框架JUnit的一个高级特性,即`@Rule`。在Java开发中,单元测试是确保代码质量、可维护性和可靠性的重要手段,而JUnit作为最流行的Java单元测试框架之一,...
《探索JUnit4扩展:深入Rule》 JUnit是Java开发者最常用的单元测试框架,它极大地简化了测试代码的编写。在JUnit4中,引入了一个强大的特性——Rule,这使得测试更加灵活且可定制化。本文将深入探讨Rule的概念、...
《Junit4 入门详解》 JUnit 是一个用于Java编程语言的单元测试框架,而Junit4作为其第四代版本,引入了许多新特性和改进,使得测试...同时,不断探索Junit4的高级特性,你会发现它能为你的软件开发带来无尽的便利。
《深入解析JUnit4:探索开源测试框架的精髓》 JUnit4是Java开发中广泛使用的单元测试框架,它的开源性质使得开发者能够深入理解其内部机制,从而更好地利用它进行测试驱动开发(TDD)。本篇文章将从`junit4-example...
【深入JUnit4.x】—— 探索Java单元测试框架的核心 JUnit是Java开发中最常用的单元测试框架,尤其在JUnit4.x版本中,它引入了许多改进和特性,使得测试更加灵活和强大。这篇深入的文章将围绕JUnit4.x的核心概念、...
《深入理解JUnit:Java单元测试框架的探索与实践》 JUnit是Java编程语言中最流行的单元测试框架之一,它为开发者提供了简洁、高效的测试工具,帮助确保代码的质量和可靠性。本篇文章将围绕“junit-master.zip”这个...
4. **测试套件**:使用`@RunWith(Suite.class)`注解,可以将多个测试类组合成一个测试套件,便于批量运行。 5. **假设(Assumptions)**:JUnit 4.10引入了`Assume`类,允许在运行测试之前进行先决条件检查。如果...
此外,Junit4引入了`@Rule`,允许自定义测试规则,如使用`ExpectedException`规则来捕获并处理预期的异常。而到了Junit5,引入了更多的扩展机制,如条件测试(@EnabledIf、@DisabledIf)、参数化测试的增强等,使得...
JUnit是Java编程语言中最常用的单元测试框架之一,它在软件开发过程中起着至关重要的作用,确保代码的质量和可维护性。...通过不断实践和探索,开发者可以充分利用JUnit提供的功能,构建出更加健壮和可靠的软件系统。
7. **参数化测试**:使用`@Parameters`和`@Parameterized`注解,可以创建参数化的测试,同一测试方法可以针对多组输入数据进行执行。 8. **测试规则**:JUnit的`TestRule`接口允许定义自定义的测试规则,例如,可以...
Drools支持基于DSL(领域特定语言)的规则定义,可以使用JUnit进行规则测试,并且与Java EE和Spring框架有良好的集成。 2. **规则的创建**:PPT会展示如何用Drools的DRL(Drools Rule Language)编写规则。DRL类似...
10. JUnit扩展:除了基础的JUnit,还可以使用如Parameterized测试、Rule机制和TestWatcher等扩展功能,提高测试的覆盖率和灵活性。 综上所述,"testR-master"可能是一个包含Java测试代码的项目,涵盖了从单元测试到...