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 ...
随机推荐
- Ubuntu/Debian交叉编译安装ARM平台版本的ffmpeg
1 准备工作 (1)libmp3lame库 下载: wget http://downloads.sourceforge.net/lame/lame-3.99.tar.gz 解压 编译:./con ...
- 中兴ZXV10 B860AV1.1 全TTL操作完美破解
本文转自:http://www.znds.com/tv-496624-1-1.html 1)前期准备工作 1.1 拆开盒子,TTL接线,这个论坛里有好多其它帖子,就不再详细描述. 1.2 复制需要安装 ...
- Bootstrap学习笔记(8)--响应式导航栏
说明: 1. 响应式导航栏,就是右上角的三道杠,点一下下方出现隐藏的导航栏.如果屏幕够大就显示所有的导航选项,如果屏幕小比如手机,就显示部分,剩下的放到三道杠里隐藏. 2. 外面套一个大的div,其实 ...
- UNION types numeric and text cannot be matched
NULL ::NUMERIC 有时候会遇到这个问题,那是因为几个SQL组合在一起的时候,同一个字段的值,出来了不同类型的时候,这种时候就需要进行转型的处理了.
- CSS——div居中,window.open(0
margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度自适 ...
- /proc/meminfo分析
参考: 1. linux/Documentation/filesystems/proc.txt 2. Linux 中 /proc/meminfo 的含义 3. redhat deployment gu ...
- C#连接手机安装软件和发送信息
今天突然想到怎么用winform程序连接自己的安卓手机,然后做发送短信的操作,查了很多资料 发现用ADB.exe 这个安卓自带的调试库 可以实现挺多功能的 前提是你自己手机已经和你电脑连接成功过,就是 ...
- Spring.Net框架二:配置Spring.Net框架环境
一.下载DLL文件 去Spring的官方网站下载并解压,然后直接添加dll文件的引用就可以了.在上一篇文章中,已经介绍过Spring.Net框架中需要使用到的dll文件.这些程序集文件位于Spring ...
- WebIM技术---编写前端WebSocket组件
过去我们想要实现一个实时Web应用通常会考虑采用ajax轮循或者是long polling技术,但是因为频繁的建立http连接会带来多余的请求以及消息精准性的问题,让我们在实现实时Web应用时头疼不已 ...
- 29Mybatis_整合ehcache以及应用场景
ehcache是一个分布式缓存框架. 分布缓存