这里对BlockJUnit4ClassRunner中几个跟写单元测试最相关的几个方法进行分析
(1)构造方法
public BlockJUnit4ClassRunner(Class<?> klass) throws InitializationError {
super(klass);
}
作用:是取得类的声名描述,即Class<?> klass
(2)createTest
protected Object createTest() throws Exception {
return getTestClass().getOnlyConstructor().newInstance();
}
作用:根据Class,创建测试用例类实例。
(3)withPotentialTimeout
protected Statement withPotentialTimeout(FrameworkMethod method,
Object test, Statement next) {
long timeout= getTimeout(method.getAnnotation(Test.class));
return timeout > 0 ? new FailOnTimeout(next, timeout) : next;
}
(4)withBefores
protected Statement withBefores(FrameworkMethod method, Object target,
Statement statement) {
List<FrameworkMethod> befores= getTestClass().getAnnotatedMethods(
Before.class);
return new RunBefores(statement, befores, target);
}
我们在单元测试时加注解@Befores,就是调用这个方法被执行的。
(5) withAfters
protected Statement withAfters(FrameworkMethod method, Object target,
Statement statement) {
List<FrameworkMethod> afters= getTestClass().getAnnotatedMethods(
After.class);
return new RunAfters(statement, afters, target);
}
我们在单元测试时加注解@Afters,就是调用这个方法被执行的。
(6) methodBlock
protected Statement methodBlock(FrameworkMethod method) {
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);
return statement;
}
(6) methodBlock
protected Statement methodBlock(FrameworkMethod method) {
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);
return statement;
}
分析这个类的原因,是想了解Junit的方法执行顺序是如何处理的。
采用的是双向链表的数据结构。而Statement代表了一个操作,即单元测试中所要处理的一个环境。像在单元测试中所加的注解@Befores,@Afters等等都是Statement。Statement是个抽象类,所以操作都要重写evaluate方法,在继承statement的同时,做成双向的有序链表,这样就可以顺序的执行操作了。以RunBeforeTestMethod的源代码可以看到这点。
public class RunBeforeTestMethod extends Statement {
private final Statement next;
private final Object testInstance;
private final Method testMethod;
private final TestContextManager testContextManager;
public RunBeforeTestMethod(Statement next, Object testInstance, Method testMethod,
TestContextManager testContextManager) {
this.next = next;
this.testInstance = testInstance;
this.testMethod = testMethod;
this.testContextManager = testContextManager;
}
@Override
public void evaluate() throws Throwable {
this.testContextManager.beforeTestMethod(this.testInstance, this.testMethod);
this.next.evaluate();
}
}
而前面提到的代码
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);
就是在整理各个操作间执行的先后顺序。
以上简单分析了Junit是如何执行单元测试用例的。
下一节介绍如何扩做自己的容器。以Spring提供实现为例。
分享到:
相关推荐
本篇文章将深入到JUnit的源码中,探讨Runner的实现原理,帮助开发者更好地理解和利用JUnit进行测试。 在JUnit中,Runner的主要职责是负责运行测试案例。默认的`BlockJUnit4ClassRunner`是JUnit4中的基础Runner,它...
**Junit源码分析(圣思园)** Junit是Java编程语言中最广泛使用的单元测试框架,它使得开发者能够方便地编写和运行可重复的、可靠的测试用例。本篇文章将深入探讨Junit的源码,揭示其内部工作原理,帮助我们更好地...
自定义JUnit源码是一个对Java开发人员非常有帮助的主题,特别是对于那些想要深入理解测试框架工作原理或希望根据自身需求定制测试工具的开发者。JUnit是一个广泛使用的单元测试框架,它简化了编写和运行针对Java代码...
10. **持续集成**:JUnit源码也揭示了如何将测试集成到持续集成(CI)系统,如Jenkins、Travis CI等,确保每次代码变更后都能自动运行测试并获取反馈。 总的来说,分析《JUnit in Action》的源码,不仅可以帮助我们...
源码中的各个文件名暗示了不同的测试场景和应用领域,让我们逐一解析: 1. **CoffeeShopModelTests**: 这部分源码可能包含了对咖啡店模型(CoffeeShop Model)的测试。模型层通常负责业务逻辑,因此这些测试可能...
2. **JUnit框架**:JUnit源码在NetBeans中的实现意味着我们可以看到如何在IDE内部封装和扩展JUnit的API。这可能涉及到对`@Test`注解的处理,以及如何触发测试执行和显示测试结果。 3. **事件监听和API调用**:...
《深入理解JUnit 4.12:源码解析与应用实践》 JUnit是Java编程语言中最流行的单元测试框架,它的存在极大地推动了敏捷开发和持续集成的实践。本篇文章将聚焦于JUnit 4.12版本,通过源码解析和实际应用,带你深入...
4. 源码解析 在 "java-junit-jenkins-master" 压缩包中,我们可以看到一个示例项目的源码,它演示了如何配置 Jenkins 来运行 JUnit 测试。这个项目可能包含以下关键组件: - `pom.xml`:Maven 项目配置文件,其中...
【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...
《深入解析JUnit源码》 JUnit是Java编程语言中最广泛使用的单元测试框架,它为开发者提供了编写和执行可重复测试的便利工具。本篇将基于"junit-example-源码.rar"这一压缩包中的源码,对JUnit的核心概念、工作原理...
《深入解析JUnit测试框架——基于junit-demo-源码》 JUnit是一款广泛应用于Java编程语言中的单元测试框架,它为开发者提供了简洁、高效的测试工具,使得代码的质量得到了显著提升。通过对"junit-demo-源码"的分析,...
JUnit Platform为其他测试框架提供了一个运行时环境,JUnit Jupiter是JUnit 5的主要编程模型,而JUnit Vintage则用于兼容旧版本的JUnit。 在JUnit 5中,测试注解得到了显著增强。例如,`@Test`注解现在可以接受一个...
《AndroidJUnitReport:深入解析与应用》 在Android开发中,测试是不可或缺的一环,而JUnit...通过对源码的学习和二次开发,开发者可以进一步提升测试流程的自动化和智能化水平,为项目的持续优化和维护提供有力支持。
在持续集成环境中,如Jenkins、Travis CI等,Junit的XML报告格式可以被这些工具解析,以便于监控测试结果,确保每次提交都能通过所有测试。 总结,Junit是Java开发中的重要工具,掌握其使用方法和高级特性能够提升...
《深入理解JUnit——Java单元测试框架解析》 JUnit是一个广泛使用的Java编程语言的单元测试框架,它是开源项目,由Eclipse基金会维护。JUnit是 Extreme Programming(XP)实践中的一个重要工具,它鼓励程序员进行...
《深入解析JUnit 5:基于junit5-r5.3.1.zip的源码分析》 JUnit 5作为Java领域中最流行的单元测试框架之一,它的每次更新都备受开发者关注。在junit5-r5.3.1.zip这个压缩包中,我们得到了JUnit 5的源码,这为我们...
《深入解析JUnit 3.8.1源码》 JUnit是Java编程语言中广泛使用的单元测试框架,它为开发者提供了一种简洁、高效的方式来编写和运行测试用例,确保代码的质量。本文将深入探讨JUnit 3.8.1版本的源码,带你走进单元...
**二、HttpUnit简介** `HttpUnit` 是一个模拟浏览器行为的库,它可以发送 HTTP 请求并解析响应,从而帮助测试 Web 应用程序的客户端逻辑。它支持 HTML、JavaScript、Cookie、表单提交、AJAX 等功能,使得测试无需...
本教程将深入解析Junit 4 的各项功能和使用技巧,通过源码分析帮助读者更深入地理解其工作原理。 1. **基本注解** (eclipse-JunitBasicAnnotations.rar) - `@Test`: 这是标记测试方法的关键注解。每个包含此注解的...
通过"源码"和"工具"这两个标签,我们可以推断这篇博文可能还会深入探讨如何在实际项目中结合源码管理和版本控制工具(如Git)来实现自动化测试和报告生成。同时,可能会分享一些最佳实践和注意事项,以帮助开发者更...