JUnit in Action 2nd Edition 第一章 JUnit 概述 (1)

第一章:Junit初探

所有的代码都是测试通过的。

在开发中,我们首先要做的是对程序进行可接受性测试。我们编码,编译,运行,测试。测试当鼠标点击按钮时程序是否会作出期望的回应。为此,我们每天进行编码,编译,运行,测试。

我们测试时,尤其在测试开始时常常发现很多问题。因此我们再一次编码,编译,运行,测试。

我们常常开发一个模型来进行非正式的测试:添加记录,查看记录,编辑记录,删除记录。像这样手动运行一个小的测试套件就足够我们测试了,因此我们一再地重复。

一些开发者喜欢这种重复的测试方式。深思和硬编码会打断愉快的心情,当我们通过少量的鼠标点击测试后发现了bug,就会有一种成功的感觉:我找到它了!

其它的开发者不喜欢这种重复的工作方式。与其手工进行测试,他们更愿意创建一些小的程序来使测试自动地运行。运行测试代码是一回事,运行自动化测试又是另一回事。

如果你是一个测试开发人员,这本书非常适合你。我们将向你演示如何简单,有效,有趣地创建自动化测试。

如果你已经对测试感兴趣,这本书也适合你。第一部分将覆盖一些基础的内容,往后有所增强,实际开发问题将会在第二,三,四部分。

1.1证明它的工作原理

一些开发者认为自动化测试是开发过程中一个必要的组成部分:你不能证明一个组件能正确地运行,除非它能通过所有的测试。有些开发者认为单元测试是如此的重要,因此单元测试也应当有自己的测试框架,在1997年, 埃里克伽马(Erich Gamma)和肯特贝克(Kent Beck)创建了一个简单但是有效的单元测试框架,叫做JUnit。根据这样的设计,他们创建了Smalltalk的早期框架,叫 SUnit

定义(Definition:框架是一个半成品的应用程序,框架提供一个可用的,通用的结构来进行应用程序之间的共享。开发者们将框架结合到他们自己的程序中,并扩展框架来满足他们特定的需求。框架不像工具箱一样提供一致的结构,而是一些简单实用类的集合。

如果你知道这些名字,就有足够的理由学习JUnit。埃里克伽马是《设计模式》的作者,肯特贝克是《极限编程》的作者。

JUnit是一个开源软件,遵从IBM发布的通用公共许可证1.0版并托管在SourceForge下,这个通用公共许可证是商业公开的:人们可以发布商业的Junit而没有过多的繁文缛节和限制。

Junit迅速地成为Java开发中单元测试的标准框架。基于这样的测试模型,形成了众所周知的测试框架:XUnit,它派生成为了许多开发语言的标准框架,可以用于ASP,C++, C#, Eiffel, Delphi, Perl, PHP, Python, REBOL, Smalltalk, and Visual Basic等等。

JUnit团队并没有发明软件测试或者单元测试,原先单元测试这个术语描述了这样一个测试,单元测试是检查一个独立单元工作的行为。

随着时间的推移,单元测试也扩大了应用范围,比如,IEEE是这样定义单元测试:测试独立的软件单元或者硬件单元或者一组相关的单元。

在这本书中,我们使用单元测试这个术语的侠义概念,就是检查一个独立单元工作的行为而不涉及其它概念。我们专注于这种小的类型,随着增量测试,开发者可以把相应的单元应用到他们的代码中。有时我们称他们为程序员测试以区别质量保证测试或者客户测试。

这是我们对典型的单元测试一般性的描述:验证一个方法接收一个期望的输入并返回一个期望的输出。

这个描述要求我们的测试方法通过接口的行为:如果我们给一个值 X,它将返回一个值Y,如果我们使用一个值Z替换X ,那么它将抛出一个正确的异常。

 

定义(Definition):单元测试检查一个明显的单元工作的行为,在Java程序中,“明显的工作单元”常常是(不总是)一个单独的方法。相比之下,集成测试和验收测试检查的是多个组件之间是如何交互。一个工作单元的任务,不直接依赖于其他任何任务的完成。

 

单元测试常常关注的测试重点是方法是否遵从了API接口协议。就像人们制定的书面协议以用于在特定的条件下同意交换商品或者服务。一个API契约是一个正式的协议由方法签名产生。一个方法需要它的调用者提供准确的对象引用或者原始值然后返回一个对象的引用或者原始值。假如方法不能满足接口协议,测试将抛出一个异常,这时我们说这个方法破坏了它的协议。

在这一章中,我们从头开始创建一个单元测试来测试一个简单的类。我们先写一个测试运用最小的运行框架,因此你可以到我们是如何做的,然后我们展开JUnit来向你演示正确的工具如何使生活更简单。

 

定义(Definition):API协议是应用程序接口(application programming interface)的缩写,作为调用者和被调用者之间的正式协议。单元测试常常通过演示期望的行为来帮助定义API协议。API协议的概念起源于实践,由埃菲尔编程语言推广(Eiffel programming language

 

1.2、从零开始

我们的第一个范例,我们创建一个简单的calculator类来计算两数相加,calculator类提供一个API给客户端但是不包括用户界面。请看列表1.1

Listing 1.1 The test calculator class

public class Calculator{

    public double add(double number1,double number2){

    return number1+number2;

    }

}

虽然上面代码没有文档说明,但是Calculator类的adddoubledouble)方法的明显目的是计算两个double类型数字相加然后返回double类型的和。编译器能够告诉我们代码是否可以编译成功,但是我们也将够确定它在运行的时候也能工作。一个核心的单元测试原则是:不能自动化测试的程序是不应保留的。add方法表示Calculator类的核心功能,我们有一些代码实现这些功能,现在缺少的是一个自动化测试来证明我们的实现是否运行。

是否add方法太简单而不会出错?

add方法的实现太简单而不会出错,如果add方法是一个较小的实用方法,然后我们不能直接地测试它。有这样一个测试用例,如果add方法运行失败,那么运行add方法的测试用例也将失败。add方法能够被间接地测试,尽管如此测试,在Calculator程序的上下文中,add不仅仅是一个方法,它是一个程序的功能。为了对程序更有信心,大多数的开发者希望add功能能够有自动化测试。不管这个实现有多么的简单。在一些测试用例中,我们能够证明程序的功能通过自动化功能测试或者自动化验收测试。更多关于软件测试的论述,请看第三章。

 

在这一点上的似乎任何测试都是有问题的,我们即使没有一个用户界面来输入一对double类型数字,也能够编写一个小的命令行程序来等待我们输入两个double类型的值然后显示运算结果。然后我们也可以测试我们自己是否有能力去输入数字然后添加结果给自己。这不仅仅是我们想要做的事情,我们想要知道是否这个工作单元添加两个double数字然后返回正确的和,我们不想去测试是否程序员可以输入数字。

同时,如果我们将要努力地测试我们的工作,我们也应该尝试保持这份努力。我们写的adddoubledouble)方法可以运行是令人高兴的。但是当我们把应用程序其余部分装载后或者每当我们做后续的修改时,我们实际上是想知道这个方法是否将正确地工作。如果我们将这些需求放在一起,我们想出一个主意来编写一个简单的测试程序来测试add()方法。

测试程序通过已知的值传递给add方法然后看返回的结果是否与期望值相匹配。我们也能够再次运行测试程序去确认方法能够持续地运行随着应用程序的不断增长。我们如何编写最简单的测试程序?关于CalculatorTest测试程序如列表1.2所示?

LIsting 1.2 A simple test Calculator program

public class CalculatorTest{

    public static void main(String[] args){

        Calculator calculator = new Calculator();

        double result = calbulator.add(10,50);

        if (result != 60){

        System.out.println(“Bad result:” + result);

        }

    }

}

第一个CalculatorTest类测试程序确实很简单。

它创建一个Calculator的实例,输入两个数字,然后检查运算结果。如果结果和我们的期望值不匹配,我们将打印一条标准的输出信息。

如果我们编译然后运行这个测试程序,测试将静默地通过,似乎所有的看起来都很好。但是如果我们修改代码使它失败会发生什么呢?我们将不得不非常仔细地观察屏幕的错误信息。我们不得不提供输入,但是我们依旧测试我们的能力去监视程序的输出。我们希望的是测试代码,而不是我们自己。

Java里面最方便的方式去发送错误条件是抛出一个异常,我们抛出一个异常而不是指示测试失败。

同时,我们也可能去运行程序测试其它的Calculator的方法,即使我们还没有编写。像减法(subtract)和乘法(multiply)。可迁移模块化设计扩展测试程序后使它更容易捕捉和处理异常。列表1.3展示了一个较好的CalculatorTest程序。

Listing 1.3  A(slightly) better test calculator program

public class CalculatorTest{

    private int nberrors = 0;

    public void tetAdd(){

        Calculator calculator = new Calculator();

        double result = calculator.add(10.,50);

        if (result != 60){

        throw new IllegalStateException(“Bad result:” + result);

        }

    }

    public static void main(String[] args){

        CalculatorTest test = new CalculatorTest();

        try{

            test.tetAdd();

        }catch(Throwable e){

            test.nbErrors++;

            e.printStackTrace();

        }

        if (test.nbErrors > 0){

             throw new IllegalStateException(“Thers were” + test.nbErrors  + “error(s)”);

        }

   }

}

 

 

 

我们将测试到自己的add方法,现在很容易关注测试做了什么,在后面单元测试中我们也能添加更多的方法,没有主方法很难去维持。

 当产生错误的时候我们改变主方法去打印堆栈跟踪,如果有许多错误,通过一个总结性的异常来结束。

现在你看到的是一个简单的应用和它的测试程序,你可以看到,即使这样小的类和它的测试都可以从测试代码中获益,我们已经创建运行和管理测试结果。因为应用程序会变得越来越复杂和更多的测试参与,不断地构建和维护我们自定义的测试框架将成为我们的负担。

下一章,我们后退一步,看一下一个单元测试框架的一般测试用例。

 

1.3理解单元测试框架

单元测试框架应该遵循的几个最佳实践,在CalculatorTest程序中这些看起来较小的改进强调了所有的单元测试框架应遵循如下三条原则(我们的经验):

n 每一个单元测试应当独立于其它单元测试

n 在测试中框架应当监测和报告错误

n 应当很容易地去定义哪个一单元测试将运行

这个“略胜一筹”的测试程序接近符合这些原则,但是依旧有些不足。例如,为了每个单元测试能够真正地独立,每一个测试应当运行在不同的类实例和不同的类加载实例下。

我们通过添加一个新的方法来增加新的单元测试,然后添加一个合适的try/catch 块给main方法。这是一个步骤,但它仍然是不足的,我们想要一个真正的单元测试套件。我们的经验告诉我们大量的try/catch 块会引起许多维护问题。我们很容易地忽略一个单元测试和忘记它。如果我们可以添加新的测试方法然后继续运行,这将是我们想要的。但是如何使程序知道所要运行的方法呢?好吧,一个方法是我们创建有一个简单的注册步骤。一个注册方法将至少有一个清单来决定运行哪些测试。

另一种方法是使用 Java 的反射机制(reflection)和自动测试能力。一个程序可以审视它自己,并决定运行遵循一定的命名约定任何方法,就像以test命名开头的方法,例如:

很容易添加测试(前面表中的第三规则),听起来像一个单元测试框架的一个很好的规则,它支持代码识别这个规则(通过注册或者自动测试)将不会毫无价值,但这将是值得的。

在之前会有很多的工作,但是这一个努力将使我们添加一个新的测试时获得回报。

幸运的是,JUnit团队已经解决我们的问题,JUnit框架已经支持自我测试方法,它也支持使用不同的类实例和不同的类加载实例,它能够在测试试验时报告所有的错误。

现在你有一个更好的主意,为什么需要一个单元测试框架呢?尤其是Junit

1.4JUnit 设计目标

JUnit团队已经对框架定义了三条独立的目标:

n 框架必须帮助我们编写有用的测试

n 框架必须帮助我们创建测试随着时间的推移并保留价值。

n 框架必须帮助我们重用代码以降低编写测试的成本

我们会回顾这些目标在第二章。

下一节,我们行动之前,我们向你演示如何设置JUnit

 

 未完待续........

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书从认识JUnit、不同的测试策略、JUnit与构建过程、JUnit扩展4个方面,由浅入深、由易到难地对JUnit展开了系统的讲解,包括探索JUnit的核心、软件测试原则、测试覆盖率与开发、使用stub进行粗粒度测试、使用mockobjects进行测试、容器内测试、从Ant中运行JUnit测试、从Maven2中运行JUnit测试、持续集成工具、表示层的测试、Ajax测试、使用Cactus进行服务器端的Java测试、测试JSF应用程序、测试OSGi组件、测试数据库访问、测试基于JPA的应用程序、JUnit的其他用法等内容。 需要的朋友们可以下载试试吧! JUnit实战(第2版)中文版不仅仅介绍了使用JUnit框架测试项目必须掌握的核心概念,还指导读者如何使用JUnit框架编写自己的测试用例,并针对在编写代码的过程中如何使得代码可测试给出建议。本书还介绍了基础的软件开发原则,如测试驱动开发(TDD)等,以便指导用户如何使用不同的工具来测试典型JavaEE应用程序的每一层。此外,本书也提供了几个附录,以帮助读者快速转换到最新版本的JUnit,并且能够轻松地集成自己喜欢的IDE。 本书适合于已具有一定Java编程基础的读者,以及在Java平台下进行各类软件开发的开发人员、测试人员。对于单元测试学习者和编程爱好者来说,本书则具有极高的学习参考价值。大家可以下载参考学习一下!
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean 2.2.1 声明一个简单的Bean 2.2.2 通过构造函数注入 2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入 3.2.1 基本的方法替换 3.2.2 获取器注入 3.3 注入非Spring Bean 3.4 注册自定义属性编辑器 3.5 使用Spring的特殊Bean 3.5.1 后处理Bean 3.5.2 Bean工厂的后处理 3.5.3 配置属性的外在化 3.5.4 提取文本消息 3.5.5 程序事件的解耦 3.5.6 让Bean了解容器 3.6 脚本化的Bean 3.6.1 给椰子上Lime 3.6.2 脚本化Bean 3.6.3 注入脚本化Bean的属性 3.6.4 刷新脚本化Bean 3.6.5 编写内嵌的脚本化Bean 3.7 小结 第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring里使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存方案 5.7.2 缓存的代理Bean 5.7.3 注解驱动的缓存 5.8 小结 第6章 事务管理 6.1 理解事务 6.1.1 仅用4个词解释事务 6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票 7.3.3 处理投票弃权 7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染内容 7.5.2 显示用户身份验证信息 7.6 保护方法调用 7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或Burlap公开Bean的功能 8.4 使用HTTP invoker 8.4.1 通过HTTP访问服务 8.4.2 把Bean作为HTTP服务公开 8.5 Spring和Web服务 8.5.1 使用XFire将Bean输出为Web服务 8.5.2 使用JSR-181注释声明Web服务 8.5.3 消费Web服务 8.5.4 使用XFire客户端代理Web服务 8.6 小结 第9章 在Spring中建立契约优先Web服务 9.1 介绍Spring-WS 9.2 定义契约(首先!) 9.3 使用服务端点处理消息 9.3.1 建立基于JDOM消息的端点 9.3.2 序列化消息载荷 9.4 合并在一起 9.4.1 Spring-WS:全景视图 9.4.2 将消息映射到端点 9.4.3 置入服务端点 9.4.4 配置消息序列化器 9.4.5 处理端点异常 9.4.6 提供WSDL文件 9.4.7 部署服务 9.5 消费Spring-WS Web服务 9.5.1 使用Web服务模板 9.5.2 使用Web服务的网关支持 9.6 小结 第10章 Spring消息 10.1 JMS简介 10.1.1 构建JMS 10.1.2 介绍JMS的优点 10.1.3 在Spring中安装ActiveMQ 10.2 协同使用JMS和Spring 10.2.1 处理冗长失控的JMS代码 10.2.2 使用JMS模板 10.2.3 转换消息 10.2.4 将Spring的网关支持类应用于JMS 10.3 创建消息驱动POJO 10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean(EJB 2.x) 11.1.2 将EJB置入Spring Bean 11.2 开发Spring驱动的EJB(EJB 2.x) 11.3 Spring和EJB3 11.3.1 引入Pitchfork 11.3.2 从Pitchfork起步 11.3.3 通过注释注入资源 11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler Mapping 13.2.2 使用ControllerClassName HandlerMapping 13.2.3 使用元数据映射控制器 13.2.4 使用多映射处理器 13.3 用控制器处理请求 13.3.1 处理命令 13.3.2 处理表单提交 13.3.3 用向导处理复杂表单 13.3.4 使用一次性控制器 13.4 处理异常 13.5 小结 第14章 渲染Web视图 14.1 视图解析 14.1.1 使用模板视图 14.1.2 解析视图Bean 14.1.3 选择视图解析器 14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity模板 14.4.2 使用FreeMarker 14.5 产生非HTML输出 14.5.1 产生Excel工作表 14.5.2 产生PDF文档 14.5.3 开发自定义视图 14.6 小结 第15章 使用Spring Web Flow 15.1 开始Spring Web Flow之旅 15.1.1 安装Spring Web Flow 15.1.2 配置流程执行程序 15.1.3 登记流程定义 15.2 布置流程的基础 15.2.1 流程变量 15.2.2 start和end状态 15.2.3 搜集顾客信息 15.2.4 绑定比萨饼订单 15.2.5 完成订单 15.2.6 几个结束工作 15.3 高级Web流程技术 15.3.1 使用decision状态 15.3.2 提炼子流程并使用子状态 15.4 集成Spring Web Flow与其他框架 15.4.1 Jakarts Struts 15.4.2 JavaServer Face 15.5 小结 第16章 集成其他Web框架 16.1 协同使用Spring和Struts 16.1.1 向Struts注册Spring插件 16.1.2 编写知晓Spring的Struts动作 16.1.3 委托Spring配置的动作 16.1.4 关于Struts 2 16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring Bean 16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 使用JUnit B.1.3 Spring在测试中的角色 B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean 2.2.1 声明一个简单的Bean 2.2.2 通过构造函数注入 2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入 3.2.1 基本的方法替换 3.2.2 获取器注入 3.3 注入非Spring Bean 3.4 注册自定义属性编辑器 3.5 使用Spring的特殊Bean 3.5.1 后处理Bean 3.5.2 Bean工厂的后处理 3.5.3 配置属性的外在化 3.5.4 提取文本消息 3.5.5 程序事件的解耦 3.5.6 让Bean了解容器 3.6 脚本化的Bean 3.6.1 给椰子上Lime 3.6.2 脚本化Bean 3.6.3 注入脚本化Bean的属性 3.6.4 刷新脚本化Bean 3.6.5 编写内嵌的脚本化Bean 3.7 小结 第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring里使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存方案 5.7.2 缓存的代理Bean 5.7.3 注解驱动的缓存 5.8 小结 第6章 事务管理 6.1 理解事务 6.1.1 仅用4个词解释事务 6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票 7.3.3 处理投票弃权 7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染内容 7.5.2 显示用户身份验证信息 7.6 保护方法调用 7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或Burlap公开Bean的功能 8.4 使用HTTP invoker 8.4.1 通过HTTP访问服务 8.4.2 把Bean作为HTTP服务公开 8.5 Spring和Web服务 8.5.1 使用XFire将Bean输出为Web服务 8.5.2 使用JSR-181注释声明Web服务 8.5.3 消费Web服务 8.5.4 使用XFire客户端代理Web服务 8.6 小结 第9章 在Spring中建立契约优先Web服务 9.1 介绍Spring-WS 9.2 定义契约(首先!) 9.3 使用服务端点处理消息 9.3.1 建立基于JDOM消息的端点 9.3.2 序列化消息载荷 9.4 合并在一起 9.4.1 Spring-WS:全景视图 9.4.2 将消息映射到端点 9.4.3 置入服务端点 9.4.4 配置消息序列化器 9.4.5 处理端点异常 9.4.6 提供WSDL文件 9.4.7 部署服务 9.5 消费Spring-WS Web服务 9.5.1 使用Web服务模板 9.5.2 使用Web服务的网关支持 9.6 小结 第10章 Spring消息 10.1 JMS简介 10.1.1 构建JMS 10.1.2 介绍JMS的优点 10.1.3 在Spring中安装ActiveMQ 10.2 协同使用JMS和Spring 10.2.1 处理冗长失控的JMS代码 10.2.2 使用JMS模板 10.2.3 转换消息 10.2.4 将Spring的网关支持类应用于JMS 10.3 创建消息驱动POJO 10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean(EJB 2.x) 11.1.2 将EJB置入Spring Bean 11.2 开发Spring驱动的EJB(EJB 2.x) 11.3 Spring和EJB3 11.3.1 引入Pitchfork 11.3.2 从Pitchfork起步 11.3.3 通过注释注入资源 11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler Mapping 13.2.2 使用ControllerClassName HandlerMapping 13.2.3 使用元数据映射控制器 13.2.4 使用多映射处理器 13.3 用控制器处理请求 13.3.1 处理命令 13.3.2 处理表单提交 13.3.3 用向导处理复杂表单 13.3.4 使用一次性控制器 13.4 处理异常 13.5 小结 第14章 渲染Web视图 14.1 视图解析 14.1.1 使用模板视图 14.1.2 解析视图Bean 14.1.3 选择视图解析器 14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity模板 14.4.2 使用FreeMarker 14.5 产生非HTML输出 14.5.1 产生Excel工作表 14.5.2 产生PDF文档 14.5.3 开发自定义视图 14.6 小结 第15章 使用Spring Web Flow 15.1 开始Spring Web Flow之旅 15.1.1 安装Spring Web Flow 15.1.2 配置流程执行程序 15.1.3 登记流程定义 15.2 布置流程的基础 15.2.1 流程变量 15.2.2 start和end状态 15.2.3 搜集顾客信息 15.2.4 绑定比萨饼订单 15.2.5 完成订单 15.2.6 几个结束工作 15.3 高级Web流程技术 15.3.1 使用decision状态 15.3.2 提炼子流程并使用子状态 15.4 集成Spring Web Flow与其他框架 15.4.1 Jakarts Struts 15.4.2 JavaServer Face 15.5 小结 第16章 集成其他Web框架 16.1 协同使用Spring和Struts 16.1.1 向Struts注册Spring插件 16.1.2 编写知晓Spring的Struts动作 16.1.3 委托Spring配置的动作 16.1.4 关于Struts 2 16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring Bean 16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 使用JUnit B.1.3 Spring在测试中的角色 B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值