`
favey
  • 浏览: 121500 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

在ecipse里Spring框架中进行JUnit单元测试

    博客分类:
  • JEE
阅读更多

 

ecipseSpring框架中进行JUnit单元测试<o:p></o:p>

<o:p> </o:p>

测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,JUnit是一个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCase组合成TestSuit,使测试任务自动化。Eclipse同样集成了JUnit,可以非常方便地编写TestCase<o:p></o:p>

一、             JUnit核心<o:p></o:p>

JUnit 的目的是协助您进行单元测试(Unit Test),并鼓励您先写测试。<o:p></o:p>

JUnit包括了以下的特性:<o:p></o:p>

对预期结果作断言
提供测试装备的生成与销毁
易于组织与执行测试
图型与文字介面的测试器<o:p></o:p>

<o:p> </o:p>

JUnit的核心类:TestCaseTestSuite以及BaseTestRunner,其中用的最多的就是TestCase,当需要多个TestCase的时候就要创建一个TestSuite,而运行TestSuite则要创建TestRunner,其关系如下:<o:p></o:p>

<v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" o:extrusionok="f" gradientshapeok="t"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 65.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image001.emz"></v:imagedata></v:shape><o:p></o:p>

核心类定义:<o:p></o:p>

        TestCase(测试用例)——扩展了JUnitTestCase类的类。它以testXXX方法的形式包含一个或多个测试。一个test case把具有公共行为的测试归入一组。在本书的后续部分,当我们提到测试的时候,我们指的是一个testXXX方法;当我们提及test case的时候,我们指的是一个继承自TestCase的类,也就是一组测试。

       TestSuite(测试集合——一组测试。一个test suite是把多个相关测试归入一组的便捷方式。例如,如果你没有为TestCase定义一个test suite,那么JUnit就会自动提供一个test suite,包含TestCase中所有的测试(本书稍后会细说)。

        TestRunner(测试运行器——执行test suite的程序。JUnit提供了几个test runner,你可以用它们来执行你的测试。没有TestRunner接口,只有一个所有test runner都继承的BaseTestRunner。因此,当我们编写TestRunner的时候,我们实际上指的是任何继承BaseTestRunnertest runner类。<o:p></o:p>

其中TesetCase主要有10个自己的方法:<o:p></o:p>

<v:shape id="_x0000_i1026" style="WIDTH: 374.25pt; HEIGHT: 308.25pt" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image003.jpg" o:href="http://www.ebook520.com/upload/pic/6c.jpg"></v:imagedata></v:shape><o:p></o:p>

<o:p> </o:p>

二、下面就以Eclipse中单个TestCase为例子讲一下普通的JUnit测试:<o:p></o:p>

    首先我们创建一个Java工程,添加一个example.Hello类,首先我们给Hello类添加一个abs()方法,作用是返回绝对值:<o:p></o:p>

<v:shape id="_x0000_i1027" style="WIDTH: 362.25pt; HEIGHT: 166.5pt" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image004.jpg" o:href="http://dev.yesky.com/imagelist/05/09/5jp6h43891k0.jpg"></v:imagedata></v:shape><o:p></o:p>

  下一步,我们准备对这个方法进行测试,确保功能正常。选中Hello.java,右键点击,选择New->JUnit Test Case<o:p></o:p>

<v:shape id="_x0000_i1028" style="WIDTH: 393.75pt; HEIGHT: 4in" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image005.jpg" o:href="http://dev.yesky.com/imagelist/05/09/je4t6o324657.jpg"></v:imagedata></v:shape><o:p></o:p>

  Eclipse会询问是否添加junit.jar包,确定后新建一个HelloTest类,用来测试Hello类。<o:p></o:p>

<v:shape id="_x0000_i1029" style="WIDTH: 325.5pt; HEIGHT: 5in" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image006.jpg" o:href="http://dev.yesky.com/imagelist/05/09/qhy1xo8e4n8y.jpg"></v:imagedata></v:shape><o:p></o:p>

  选中setUp()tearDown(),然后点击“Next”<o:p></o:p>

<v:shape id="_x0000_i1030" style="WIDTH: 325.5pt; HEIGHT: 5in" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image007.jpg" o:href="http://dev.yesky.com/imagelist/05/09/jdi5ics2540i.jpg"></v:imagedata></v:shape><o:p></o:p>

  选择要测试的方法,我们选中abs(int)方法,完成后在HelloTest.java中输入:<o:p></o:p>

<v:shape id="_x0000_i1031" style="WIDTH: 339pt; HEIGHT: 303pt" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\肖翱\LOCALS~1\Temp\msohtml1\02\clip_image008.jpg" o:href="http://dev.yesky.com/imagelist/05/09/cs60geuk53bk.jpg"></v:imagedata></v:shape><o:p></o:p>

  JUnit会以以下顺序执行测试:(大致的代码 <o:p></o:p>

try {
HelloTest test = new HelloTest(); //
建立测试类实例
test.setUp(); //
初始化测试环境
test.
testAbs(); // 测试某个方法
test.tearDown(); //
清理资源
}
catch…
<o:p></o:p>


  setUp()是建立测试环境,这里创建一个Hello类的实例;tearDown()用于清理资源,如释放打开的文件等等。以test开头的方法被认为是测试方法,JUnit会依次执行testXxx()方法。在testAbs()方法中,我们对abs()的测试分别选择正数,负数和0,如果方法返回值与期待结果相同,则assertEquals不会产生异常。

  如果有多个testXxx方法,JUnit会创建多个XxxTest实例,每次运行一个testXxx方法,setUp()tearDown()会在testXxx前后被调用,因此,不要在一个testA()中依赖testB()

  直接运行Run->Run As->JUnit Test,就可以看到JUnit测试结果: <o:p></o:p>

<v:shape id="_x0000_i1032" style="WIDTH: 171pt; HEIGHT: 231.75pt" alt="" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\favey\LOCALS~1\Temp\msohtml1\02\clip_image009.jpg" o:href="http://dev.yesky.com/imagelist/05/09/9rt8h7ce141o.jpg"></v:imagedata></v:shape><o:p></o:p>

  绿色表示测试通过,只要有1个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变abs()的代码,故意返回错误的结果(比如return n+1;),然后再运行JUnit就会报告错误。<o:p></o:p>

三、在Spring中进行DAO测试<o:p></o:p>

    Spring提供了下列一些特定的JUnit框架扩展:<o:p></o:p>

AbstractDependencyInjectionSpringContextTests—这是一个针对所有测试的超类,其具体使用依赖于Spring上下文。<o:p></o:p>

AbstractSpringContextTests—这是一个针对所有的JUnit测试情形的超类。它使用一个Spring上下文。并且,一般在测试中不是直接使用它,而是使用AbstractDependencyInjectionSpringContextTests或者AbstractTransactionalSpringContextTests这样的派生类。<o:p></o:p>

AbstractTransactionalSpringContextTests—这是一个针对所有测试的超类,我们一般把它应用在事务相关的测试中。注意,一旦完成每个测试它就会正常地回滚事务;而且你需要重载onSetUpInTransactiononTearDownInTransaction方法以便手工开始并提交事务。<o:p></o:p>

AbstractTransactionalDataSourceSpringContextTests—这是AbstractTransactionalSpringContextTests的一个子类,它使用了Spring的基于JDBCjdbcTemplate工具类。

所有上面这些扩展将极大程度地简化在测试时对于相关操作的依赖性注入和事务管理。<o:p></o:p>

       下面就以一个用户DAOHibernateUserDao类中的一个方法getPasswordByName(String userName)进行测试作为例子,其中输入是用户名,输出是用户密码:

 

<o:p></o:p>

测试类:<o:p></o:p>

 

//HibernateUserDAOTest.java<o:p></o:p>

public class HibernateUserDAOTest extends AbstractTransactionalDataSourceSpringContextTests <o:p></o:p>

{<o:p></o:p>

    ApplicationContext applicationContext;<o:p></o:p>

    HibernateUserDAO hub;<o:p></o:p>

    <o:p></o:p>

    @Override<o:p></o:p>

    protected String[] getConfigLocations()<o:p></o:p>

    {<o:p></o:p>

       String[] config=new String[]{"file:D:\\test\\WebRoot\\WEB-INF\\classes\\applicationContext.xml"};<o:p></o:p>

       return config;<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public ApplicationContext getContext(String[] filePath) <o:p></o:p>

    {<o:p></o:p>

<o:p> </o:p>

       return new ClassPathXmlApplicationContext(filePath);<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

       <o:p></o:p>

    public void testConfig() {        <o:p></o:p>

        assertNotNull("spring-mock context has bean init()",this.getConfigLocations());<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    <o:p></o:p>

    <o:p></o:p>

    @Test<o:p></o:p>

    public final void testGetPasswordByName() throws BaseException<o:p></o:p>

    {<o:p></o:p>

       hub=(HibernateUserDAO)getContext(getConfigLocations()).getBean("hibernateUserDAO");<o:p></o:p>

       assertEquals("234",hub.getPasswordByName("42"));<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public static void main(String[] args)<o:p></o:p>

    {<o:p></o:p>

       TestRunner.run((Class<!---->extends TestCase>) HibernateUserDAO.class);<o:p></o:p><

分享到:
评论
5 楼 雁行 2009-10-15  
好失败的界面风格啊,换一个吧,都看不清文字
4 楼 leonardoshen 2009-01-20  
3 楼 favey 2007-08-07  
对数据库的操作需要用到DBUnit这个包,因为测试时候对数据的增删都是模拟的,数据库里实际上找不到。
2 楼 linzy410 2007-08-06  
请教一个问题:
  如果现在数据库里面是空的,直接运行getPasswordByName()取到是空的,我在onSetUpInTransaction先往数据库中加一条记录,再测试,最后会有回滚的。

现在我的问题是我新加一个记录是找不到的,如果一旦我用了commit却就加到数据库中去了,回流失败了。

我想知道我该在哪里加一条记录,才能被测试找到,并能回滚。

1 楼 jzx19770812 2007-06-30  
不错,转贴到俺的blog上介意不?

相关推荐

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境的搭建是一个非常重要的步骤。本文将详细介绍如何在 Struts2+Spring+Hibernate 框架中搭建 Action 的单元测试环境。 首先,需要了解为什么需要对 ...

    Junit单元测试(很经典)

    在Java世界里,Junit是最广泛使用的单元测试框架,它为Java程序员提供了简洁易用的API来进行单元测试。本篇文章将深入探讨Junit的基础、中级和高级应用。 ### 基础篇 1. **安装与配置**:Junit通常作为Maven或...

    详解spring cloud如何使用spring-test进行单元测试

    Spring Cloud 提供了多种方式来对应用程序进行单元测试,例如使用 Spring Test 框架、JUnit 框架等。本文将主要介绍如何使用 Spring Test 框架对 Spring Cloud 应用程序进行单元测试。 使用 Spring Test 框架进行...

    spring2 junit3

    标题“spring2 junit3”指的是在Spring框架的第二个主要版本中使用JUnit3进行单元测试的相关内容。这篇博文可能探讨了如何在Spring 2.x时代利用JUnit3进行测试驱动开发(TDD),因为JUnit3是当时广泛使用的Java单元...

    eclipse搭建spring2.5

    1. **导入Spring库**:为了在Eclipse中使用Spring 2.5,你需要下载Spring框架的jar文件。这些文件通常包含在spring-framework-2.5.x.zip压缩包中。解压后,找到lib目录下的所有jar文件,例如:spring-beans-2.5.x....

    spring框架+jdbc+事务+Junit练习(银行转账)

    本实践项目旨在深入理解Spring如何整合JDBC进行数据库操作,以及如何利用JUnit进行单元测试,同时探讨了事务管理在银行业务中的重要性。我们将通过一个简单的银行转账案例,详细讲解这些技术的应用。 首先,Spring...

    eclipse for Spring2.0

    这个插件集成了Spring框架的核心功能,如配置编辑器、代码辅助、测试工具等,使得在Eclipse中开发Spring应用变得更加直观和高效。 2. **Spring插件安装** 安装Eclipse for Spring插件可以通过Eclipse的内置软件...

    eclipse+ssm框架项目源码

    9. **单元测试与整合测试**:尽管未提及,但一个完整的项目可能还包括JUnit测试,用于测试业务逻辑和数据访问层的功能。集成测试则会验证SSM各组件之间的协作。 总的来说,这个"eclipse+ssm框架项目源码"提供了一个...

    Eclipse下Spring示例HelloWorld程序

    在Eclipse这个强大的Java集成开发环境中,创建一个Spring框架的HelloWorld程序是学习Spring入门的典型步骤。这个程序展示了如何在Eclipse中配置Spring环境,编写简单的Bean定义,并通过Spring的IoC(Inversion of ...

    spring boot Junit4配置

    Spring Boot作为流行的Java框架,简化了创建和管理微服务应用的过程,但如何有效地集成和配置JUnit4进行单元测试,对于初学者来说可能是个挑战。这篇文档将详细阐述如何在Spring Boot项目中配置JUnit4,并提供使用...

    用Maven搭建Spring+Spring MVC+Hibernate框架

    5. 其他可能的辅助库,如JUnit进行单元测试,Servlet API和JSTL用于Web开发。 配置好`pom.xml`后,执行`mvn install`命令,Maven将下载所有依赖并构建项目。接下来,我们需要创建Spring的配置文件,一般为`...

    spring源码下载及导入eclipse的工具集合

    在Java开发领域,Spring框架是不可或缺的重要组成部分,它极大地简化了企业级应用的开发工作。本文将详细介绍如何下载Spring的源代码以及如何将其导入到Eclipse集成开发环境中,以便进行深度学习和定制开发。 首先...

    Eclipse搭建SSH框架所需要的包(Struts、Spring、Hibernate)

    8. **测试**:使用JUnit或其他工具对应用程序进行单元测试和集成测试,确保功能正常。 9. **部署运行**:最后,将项目打包成WAR文件,部署到Web服务器(如Tomcat)上运行。 通过上述步骤,可以成功地在Eclipse环境...

    JAVA EE Eclipse struts hibernate spring 整合应用案例

    Spring MVC是Spring框架的一部分,可以替代Struts作为MVC架构的选择,但在这个案例中,两者被整合使用,以展示不同的集成策略。 整合这些框架的关键在于理解它们各自的职责和如何协同工作。例如,Spring可以管理...

    java_junit集成_亲测可用_含有jar包以及源码

    4. 在测试方法中,可以使用 `@Autowired` 注解来注入需要测试的 Spring Bean。 这个压缩包提供的源码示例很可能是展示如何在 Spring 应用程序中设置和运行 JUnit 测试的。通过查看源码,你可以了解具体的实现细节,...

    Spring MVC eclipse开发(Demo源码)

    Spring MVC支持JUnit进行单元测试,可以对Controller、Service、DAO等进行独立测试,确保代码质量。 13. **RESTful API设计**: Spring MVC支持创建RESTful风格的API,通过HTTP动词(GET、POST、PUT、DELETE)和...

    spring源码可导入eclipse版本 第二部分

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。Spring 4.3.18是该框架的一个稳定版本,提供了许多关键功能和改进。本资源包含的是可以直接导入Eclipse IDE的Spring源码,使得开发者...

    junit+hibernate3.2+spring2.5工程

    在软件开发领域,测试是不可或缺的一部分,而Java开发中的Junit框架则是单元测试的重要工具。结合持久层框架Hibernate和依赖注入框架Spring,可以构建出高效、可维护的业务应用。本工程“junit+hibernate3.2+spring...

    ssm+log4j+JUnit(eclipse)

    **JUnit**:JUnit是Java编程语言中最常用的单元测试框架。它提供了编写和运行可重复的测试的工具,确保代码的正确性和稳定性。JUnit支持断言、参数化测试、异常测试等多种测试方法,通过注解可以使测试更简洁,更...

    JUnit3.8的初步学习

    在IDE如Eclipse或IntelliJ IDEA中,可以直接通过集成的测试运行器执行JUnit测试。也可以通过命令行运行,使用`junit.jar`和`hamcrest-core.jar`(如果使用了断言库)来运行包含测试的类。 在进行单元测试时,重要的...

Global site tag (gtag.js) - Google Analytics