1. Junit源码文件说明

  • runner
  • framework:整体框架;
  • extensions:可以对程序进行扩展;
  • textui:JUnit运行时的入口程序以及程序结果的呈现方式;
  • awtui:JUnit运行时的入口程序以及程序结果的呈现方式;
  • swingui:JUnit运行时的入口程序以及程序结果的呈现方式;

2. Junit 的两个重要接口(TestTestListener)

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 源码分析之两个接口的更多相关文章

  1. Junit 3.8.1 源码分析(一)

    写在前面:本文基于Junit3.8.1版本,因为这是我第一次进行源码学习,先从简单的源码开始学起 1. 示例代码 1.1 准备工作 下载Junit3.8.1的JAR包 需要下载junit-3.8.1- ...

  2. Struts2 源码分析——配置管理之PackageProvider接口

    本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...

  3. Struts2 源码分析——配置管理之ContainerProvider接口

    本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...

  4. Spring源码分析——BeanFactory体系之接口详细分析

    Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的I ...

  5. MyBatis框架的使用及源码分析(四) 解析Mapper接口映射xml文件

    在<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 一文中,我们知道mybat ...

  6. Java入门到精通——框架篇之Spring源码分析Spring两大核心类

    一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...

  7. Spring源码分析——BeanFactory体系之抽象类、类分析(二)

    上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...

  8. Spring源码分析——BeanFactory体系之抽象类、类分析(一)

    上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactor ...

  9. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

随机推荐

  1. Ubuntu/Debian交叉编译安装ARM平台版本的ffmpeg

    1 准备工作 (1)libmp3lame库 下载:    wget http://downloads.sourceforge.net/lame/lame-3.99.tar.gz 解压 编译:./con ...

  2. 中兴ZXV10 B860AV1.1 全TTL操作完美破解

    本文转自:http://www.znds.com/tv-496624-1-1.html 1)前期准备工作 1.1 拆开盒子,TTL接线,这个论坛里有好多其它帖子,就不再详细描述. 1.2 复制需要安装 ...

  3. Bootstrap学习笔记(8)--响应式导航栏

    说明: 1. 响应式导航栏,就是右上角的三道杠,点一下下方出现隐藏的导航栏.如果屏幕够大就显示所有的导航选项,如果屏幕小比如手机,就显示部分,剩下的放到三道杠里隐藏. 2. 外面套一个大的div,其实 ...

  4. UNION types numeric and text cannot be matched

    NULL ::NUMERIC 有时候会遇到这个问题,那是因为几个SQL组合在一起的时候,同一个字段的值,出来了不同类型的时候,这种时候就需要进行转型的处理了.

  5. CSS——div居中,window.open(0

    margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度自适 ...

  6. /proc/meminfo分析

    参考: 1. linux/Documentation/filesystems/proc.txt 2. Linux 中 /proc/meminfo 的含义 3. redhat deployment gu ...

  7. C#连接手机安装软件和发送信息

    今天突然想到怎么用winform程序连接自己的安卓手机,然后做发送短信的操作,查了很多资料 发现用ADB.exe 这个安卓自带的调试库 可以实现挺多功能的 前提是你自己手机已经和你电脑连接成功过,就是 ...

  8. Spring.Net框架二:配置Spring.Net框架环境

    一.下载DLL文件 去Spring的官方网站下载并解压,然后直接添加dll文件的引用就可以了.在上一篇文章中,已经介绍过Spring.Net框架中需要使用到的dll文件.这些程序集文件位于Spring ...

  9. WebIM技术---编写前端WebSocket组件

    过去我们想要实现一个实时Web应用通常会考虑采用ajax轮循或者是long polling技术,但是因为频繁的建立http连接会带来多余的请求以及消息精准性的问题,让我们在实现实时Web应用时头疼不已 ...

  10. 29Mybatis_整合ehcache以及应用场景

    ehcache是一个分布式缓存框架. 分布缓存