Junit 3.8.1 源码分析之两个接口
1. Junit源码文件说明
runner
framework
:整体框架;extensions
:可以对程序进行扩展;textui
:JUnit运行时的入口程序以及程序结果的呈现方式;awtui
:JUnit运行时的入口程序以及程序结果的呈现方式;swingui
:JUnit运行时的入口程序以及程序结果的呈现方式;
2. Junit 的两个重要接口(Test
和TestListener
)
2.1 Test
接口
// Junit源码
// Test.java
public interface Test{
// 统计测试方法
public abstract int countTestCases();
// 对方法进行测试,以及汇总测试结果
public abstract void run(TestResult result);
}
// TestCase.java(单个测试方法)
// 继承Assert类,实现Test类
public abstract class TestCase extends Assert implements Test{
...(略)
public int countTestCases(){
return 1;
}
public TestResult run(){
TestResult result = createResult();
run(result);
return result;
}
// 实现接口的方法
public void run(TestResult result){
result.run(this);
}
public void runBare() throws Throwable{
setUp();
try{
runTest();
}finally{
tearDown();
}
}
...(略)
}
//TestSuite.java(一组测试方法)
public class TestSuite implements Test{
private Vector fTests = new Vector(10);
private String fName;
public Enumeration tests(){
return fTests.elements();
}
public int countTestCases(){
int count = 0;
for(Enumeration e = tests(); e.hasMoreElements(); ){
Test test = (Test)e.nextElement();
count = count + test.countTestCases();
}
return count;
}
public void run(TestResult result){
for(Enumeration e = tests(); e.hasMoreElements(); ){
if(result.shouldStop())
break;
Test test = (Test)e.nextElement();
runTest(test, result);
}
}
public void runTest(Test test, TestResult result){
test.run(result);
}
}
//Assert类,对测试方法结果的断言
public class Assert{
// 构造方法
protected Assert(){
}
// 静态方法
static public void assertTrue(String message, boolean condition){
if(!condition)
fail(message);
}
static public void assertFalse(String message, boolean condition){
assertTrue(message, !condition);
}
static public void fail(String message){
throw new AssertionFailedError(message);
}
static public void assertEquals(String message, Object expected, Object actual){
if(expected == null && actual == null)
return;
if(expected != null && expected.equals(actual))
return;
failNotEquals(message, expected, actual);
}
...(略)
static private void failNotEquals(String message, Object expected, Object actual){
fail(format(message, expected, actual));
}
static String format(String message, Object expected, Object actual){
String formatted = "";
if(message != null)
formatted= message + " ";
return formatted+"expected:<"+expected+"> but was:<"+actual+">";
}
}
// TestResult 类,测试结果类
public class TestResult extends Object {
protected Vector fFailures;
protected Vector fErrors;
protected Vector fListeners;
protected int fRunTests;
private boolean fStop;
public TestResult(){
fFailures = new Vector();
fErrors = new Vector();
fListeners = new Vector();
fRunTests = 0;
fStop = false;
}
...(略)
//运行测试方法
protected void run(final TestCase test){
startTest(test);
Protectable p = new Protectable(){
public void protect() throws Throwable{
test.runBare();
}
};
runProtected(test, p);
endTest(test);
}
public void startTest(Test test){
final int count = test.countTestCases();
synchronized(this){
fRunTests+=count;
}
for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){
((TestListener)e.nextElement()).startTest(test);
}
}
public void runProtected(final Test test, Protectable p){
try{
p.protect();
}
catch(AssertionFailedError e){
addFailure(test, e);
}
catch(ThreadDeath e){
throw e;
}
catch(Throwable e){
addError(test, e);
}
}
public void endTest(Test test){
for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){
((TestListener)e.nextElement()).endTest(test);
}
}
}
2.2 TestListener
接口
// TestListener.java
public interface TestListener{
public void addError(Test test, Throwable t);
public void addFailure(Test test, AssertionFailedError t);
public void endTest(Test test);
public void startTest(Test test);
}
// 负责结果打印
// ResultPrinter.java
public class ResultPrinter implements TestListener{
//打印"E"
public void addError(Test test, Throwable t){
getWriter().print("E");
}
//打印"F"
public void addFailure(Test test, AssertionFailedError t){
getWriter().print("F");
}
public void endTest(Test test){
}
public void startTest(Test test){
getWriter().print(".");
if(fColumn++ >= 40){
getWriter().println();
fColumn = 0;
}
}
...(略)
}
// 所有TestRunListener的基类
// BaseTestRunner.java
public abstract class BaseTestRunner implements TestListener{
public synchronized void startTest(Test test){
testStarted(test.toString());
}
public synchronized void endTest(Test test){
testEnded(test.toString());
}
public synchronized void addError(final Test test, final Throwable t){
testFailed(TestRunListener.STATUS_ERROR, test, t);
}
public synchronized void addFailure(final Test test, final AssertionFailedError t){
testFailed(TestRunListener.STATUS_FAILURE, test, t);
}
// TestRunListener需要实现
public abstract void testStarted(String testName);
public abstract void testEnded(String testName);
public abstract void testFailed(int status, Test test, Throwable t);
}
参考资料:
Junit 3.8.1 源码分析之两个接口的更多相关文章
- Junit 3.8.1 源码分析(一)
写在前面:本文基于Junit3.8.1版本,因为这是我第一次进行源码学习,先从简单的源码开始学起 1. 示例代码 1.1 准备工作 下载Junit3.8.1的JAR包 需要下载junit-3.8.1- ...
- Struts2 源码分析——配置管理之PackageProvider接口
本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...
- Struts2 源码分析——配置管理之ContainerProvider接口
本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...
- Spring源码分析——BeanFactory体系之接口详细分析
Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的I ...
- MyBatis框架的使用及源码分析(四) 解析Mapper接口映射xml文件
在<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 一文中,我们知道mybat ...
- Java入门到精通——框架篇之Spring源码分析Spring两大核心类
一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(二)
上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(一)
上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactor ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
随机推荐
- lodop简单入门教程
lodop简单入门 1 安装(这个不介绍,下载安装即可) 声明只能装windows,linux不能装,所以linux 服务器要使用直接使用http://localhost:8000/CLodopfun ...
- JQuery.getJSON 没反应
Jquery是一个优秀的Javascrīpt框架,轻量级的js库,它兼容CSS3.jQuery使用户能更方便地处理HTML documents.events.实现动画效果,并且方便地为网站提供AJAX ...
- JSON 文件格式解析
JSON 文件大致说明 JSON 文件你可以理解为就是一个字典文件. 格式为 { 索引:数据, 索引:{ 索引:数据, 索引:{ 索引:数据, 索引:数据 } } } 自己写一个 my.json { ...
- 示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?
以前面生成的XML/JSON互转DLL为例, 我们写一个Console Appliction来做这件事情, 步骤如下: 1. 创建Console Project 2. 引入www.utilities_ ...
- RabbitMQ之发布订阅【译】
在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...
- 大数据(11) - kafka的安装与使用
一.Kafka概述 1.Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成.是由 ...
- 微信APP支付 - C#
最近挺忙的,没时间写东西.然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下. 1.准备各种调用接口需要的参数,配置app.config. <!-- ...
- windows下端口占用解决方法-查看和杀死占用端口进程
在Windows下启动程序时有时会遇到端口被占用的情况,由于一个端口同时只能运行一个进程,所以要想启动新的程序就要先把占用该端口的进程给kill掉,具体的命令分为以下三步, 以杀死占用了80端口的进程 ...
- javascript弹出层-DEMO001
首先上一张图 看下弹出层的效果 从图中可以看到二部分 一是弹出层 二是遮照层 弹出层:即弹出你要操作的内容 遮照层:遮照住不要操作的内空 实际技术原理主要是 CSS +JS (z-index是核心) ...
- 如果可能的话,使用 PC-Lint、LogiScope 等工具进行代码审查
如果可能的话,使用 PC-Lint.LogiScope 等工具进行代码审查. #include <iostream> #include <algorithm> #include ...