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

 

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((Classextends TestCase>) HibernateUserDAO.class);<o:p></o:p><

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值