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. jquery $.each 和for 怎么跳出循环(终止本次循环)

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each则对应的使用return true  和return false ...

  2. logcat的调试 比较有用的几个命令

    网上很多的logcat调试命令,但是太多的命令只会令人盐杂. (主要是adt工具带的调试功能容易死掉 每次都要重启太烦) 个人认为有一下几个常用命令: adb logcat -c 清除所有以前的日志 ...

  3. phpstrom直接运行和调试php

    最近想学服务器开发,但是没找到免费的虚拟主机,好在有一大把的php主机, 于是决定学php了,但并不准备学网页制作,只是把php作为服务器逻辑处理语言. 下载xampp,打开phpstrom的设置界面 ...

  4. STM32CubeMX使用方法及功能介绍

    推荐 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前面 学习本文之前可以查 ...

  5. PHP——0128练习相关3——设置文本域的默认值

    都知道文本框的的默认值只要设置value属性即可但是文本域是没有value属性的要设置文本域的默认值只要<textarea>默认值</textarea>即可简单吧,呵呵..

  6. hive中创建hive-json格式的表及查询

    在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...

  7. Netty中的那些坑

    Netty中的那些坑(上篇) 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化,一边解决各种坑.儿这些坑大部分基本上是Netty4对Netty3的改进部 ...

  8. Istio微服务架构初试

    感谢 http://blog.csdn.net/qq_34463875/article/details/77866072 看了一些文档,有些半懂不懂,所以还是需要helloworld一下.因为isti ...

  9. java---多线程及线程的概念

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  10. WebService的初级学习

    复习准备 1. Schema约束: 1.1   namespace相当于Schema文件的id: 1.2   targetNamespace属性用来指定schema文件的namespace的值; 1. ...