版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
⽤JUnit对你的代码进⾏单元测试对有些⼈来说JUnit是再熟悉不过的了,但对于另⼀些⼈来说JUnit是啥,它是⼲什么。现在集成的Java的IDE环境,如IntelliJ,MyEclipse,⼤多数都已经将JUnit模块集成好了,开发者可以直接的在⾃⼰的项⽬中使⽤JUnit的测试模块,⼗分的⽅便。在这⾥我们主要介绍的是JUnit测试⼯具的基本功能与基本的使⽤⽅法,⾄于如果将JUnit导⼊你的项⽬这⾥我就不再赘述了,你可以去JUnit官⽹下载最新的版本包导⼊⼯程,你也可以通过maven更⽅便的将JUnit4导⼊你的项⽬中。【PS:maven真是个好东西】那么我们就开始吧,⽬录⼀、JUnit4的基本介绍与使⽤⼆、⽤JUnit4来测试web项⽬中DAO层与Service层逻辑的正确性如果对JUnit有⼀定基础的⼈可以完全⽆视第⼀部分,第⼀部分主要是UP⽤⼀种逗⽐的⼼态去⽤尽可能的简单的⽅式来介绍⼀下JUnit;⽽第⼆部分则是⼀个开发web项⽬⼈必备的⼀个技能。开发环境:操作系统:MacOSXYosemiteVersion10.10.3集成开发环境(IDE):IntelliJIDEA14.1本地服务器:Tomcat8.0.21Maven版本:Maven33.0.5JUnit版本:JUnit4.11⼀、JUnit4的基本介绍与使⽤最开始我接触JUnit的功能的时候,它给我的感觉就是原来我不⽤每次都那么⿇烦的⾃⼰去新建⼀个javaclass再写⼀个main函数啊,JUnit就直接帮我做好了。复⽤⽼师总说的⼀句话是:你的开发代码要和测试代码完全的分开,不可以让测试代码混在你的开发代码中,或者说不能让你的测试代码“玷污”你的开发代码。这⾥的混在⼀起不单单指的是混⼊你的开发代码中的某⼀⾏,也包括你的测试程序混在你的开发路径⾥也是不科学的。所以⼀个java项⽬应该有三个路径,Sources,Test和Resources三个部分,Sources是你的开发代码,Test是你的测试代码,Resources是你的资源⽂件或配置⽂件。这就好像你的开发过程中使⽤MVC分层的⽅式⼀样,将不同功能的⽂件放到相应的路径下,便于管理。上⾯说了⼀⼤堆的废话,下⾯让我们举⼀个例⼦吧,先看下⾯的⼀个Class,在这个类中,它有许多的属性和函数,每个函数都执⾏对应的操作,如果我们不使⽤JUnit来测试的话,我想很⼤的可能性我们会这样做,publicclassFawofolo{privateStringname;privateintage;privateStringgender;privatedoubleheight;privatedoubleweight;publicFawofolo(){="Fawofolo";this.age=21;this.gender="female";this.height=1.414;this.weight=70;}publicFawofolo(String_name,int_age,double_height,double_weight){=_name;this.weight=_weight;}publicSystem.out.println("I'm"+name+"'sface,buthe/shedoesn'tneedmeanymore");}this.age=_age;this.gender="female";this.height=_height;voidface(){publicvoideat(double_eat){weight+=_eat;System.out.println(name+"'sweightis"+(weight)+"kg");}publicvoidleftHand(){hand");}publicvoidrightHand(){lefthand");}publicStringprint(){System.out.println(name+"'slefthandisweakerthanhis/herrightSystem.out.println(name+"'srighthandisstrongerthanhis/herreturn"Mynameis"+name+".I'm"+age+"yearsold.\n"+"I'ma"+gender+".\nMyheightis"+height+".Myweightis"+weight+"kg.";}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546publicclassMain{publicstaticvoidmain(String[]args){Fawofolofool=newFawofolo();System.out.println(fool.print());fool.face();fool.eat(12);fool.leftHand();fool.rightHand();System.out.println(fool.print());}}1234567891011写⼀个新的class,⾥⾯有⼀个main⽅法,然后在这个main⽅⾥写⼀些调⽤语句,在console中查看输出结果,来测试我们代码的正确性。如果你是⼀个严谨的程序员你可能会把这个class放到⼀个单独的路径下,但是如果你也把这个class放到你的开发路径下,哦那糟糕透了。。。。。看⼀下console的输出:看样⼦我们的⽬的还是达到了的,输出的结果和我预期的结果是相同的,但是综合其他的因素,这段代码还是糟糕了下⾯该我们的JUnit登场了,在class类名字处打开IntelliJ的quickLips,就可以看到如下的画⾯:然后我们选择CreateTest,接下来会出现选择JUnit4做为测试⼯具,DestinationPackage的根路径是你设置的Test的路径,这⾥我选择com.mark.entity就是在Test的路径下的com.mark.entity⾥⽣成我们的测试程序,setUp的功能就是在执⾏测试程序之前要准备做的事情,我勾选这个是要在程序测试开始之前先实例化⼀个Fawofolo类。对应的tearDown就是程序结束之后要做的事情,可能你在测试结束之后要释放⼀些资源或者其他的事情都写在这个⽅法下。再下⾯就是勾选你要测试的⽅法了,这⾥我们全部勾选,我们要为每⼀个⽅法⽣成⼀个测试⽅法。然后我们的测试路径下就多了这样的⼀个测试⽂件:MynameisFawofolo.I'm21yearsold.I'mafemale.Myheightis1.414.Myweightis70.0kg.I'mFawofolo'sface,buthe/shedoesn'tneedmeanymoreFawofolo'sweightis82.0kgFawofolo'slefthandisweakerthanhis/herrighthandFawofolo'srighthandisstrongerthanhis/herlefthandMynameisFawofolo.I'm21yearsold.I'mafemale.Myheightis1.414.Myweightis82.0kg.12345678910@Before是测试程序执⾏前要做的操作,每⼀个@Test都是⼀个⼩的测试程序,它们都可以独⽴的运⾏,你只需要在对应的⽅法处右击,选择run相应的⽅法就可以。我们把要测试的内容填写完整,@BeforepublicvoidsetUp()throwsException{}@TestpublicvoidtestFace()throwsException{}@TestpublicvoidtestEat()throwsException{}@TestpublicvoidtestLeftHand()throwsException{}@TestpublicvoidtestRightHand()throwsException{}@TestpublicvoidtestPrint()throwsException{}}34567891011121314151617181920212223242526272829303132光标在testFace()处的时候右击就会看到如下的情况,我们选择runTestFace()的话,会看到如下的结果,其他的⽅法同理⾸先右上的绿条表⽰程序正常的运⾏且通过了,如果为红条则表⽰程序中存在bug不可以正常的运⾏。其中console也可以显⽰你的所有输出。当然你也可以在⾮测试⽅法的地⽅右击选⾏运⾏整个测试类。第⼀部分就这样结束了,有⽊有感觉很⾼⼤上呢。。。⼆、⽤JUnit4来测试web项⽬中DAO层与Service层逻辑的正确性这⼀部分是在先前的⽂章Spring-SpringMVC-Hibernate在IntelliJ与Maven的环境下搭建的基础上,添加使⽤JUnit4对DAO层(与Service层)的业务逻辑代码进⾏测试,因为当项⽬层次较多就会涉及到合作,合作就意味着你要确保你的代码的正确性,于是测试⼯作就是必不可少的,⽽与那些我们⼈⼯的创建的测试相⽐,JUnit4的⾃动测试的强⼤性就体现出来了。⾸先我们要在环境的配置上做⼀个⼩⼩的变更,因为在之前的环境搭建⾥将spring与hibernate配置⽂件分开管理,然后在web.xml中添加了配置路径。但这在Web项⽬部署到服务器上是有效的,⽽我们现在要做是测试我们DAO层的java代码,这⼀过程完全不涉及到部署与服务器。所以我们要在spring的配置⽂件中添加索引,指向我们的hibernate的配置是什么,修改如下,在applicationContext.xml中加⼊下⾯这句,就可以了。除此之外,我们要在我们创建的测试类前声明以下内容,Fawofolofool;@BeforepublicvoidsetUp()throwsException{fool.face();}@TestpublicvoidtestEat()throwsException{voidtestLeftHand()throwsException{fool.leftHand();}@TestpublicvoidtestRightHand()throwsException{fool.rightHand();}@TestpublicvoidtestPrint()throwsException{System.out.println(fool.print());}}fool=newFawofolo();}@TestpublicvoidtestFace()throwsException{fool.eat(23);}@Testpublic345678910111213141516171819202122232425262728293031323334<importresource="infrastructure.xml"/>1@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="/META-INF/applicationContext.xml")@Transactional123@SpringJUnit4ClassRunner,是指我们要在spring的管理下进⾏我们的测试⼯作,这⼀部可能需要引⼊新的包,添加mavendependicy即可。@ContextConfigurate,指向的是我们spring的配置⽂件,请根据项⽬的实际情况指向你的spring配置⽂件。@Transactional,这是因为我们项⽬架构的原因,我们在项⽬中引⼊了事务,只有事务的开启的时候才可以进⾏Hibernate的操作,如过操作出现问题就会回滚,但是我们仅仅在service层开启了事务,在dao层并没有,所以如果对我们DAO层的程序代码进⾏测试就需要添加这句,表⽰在测试程序中开启事务,以便我们正常的完成测试过程。其实我们DAO层的⼤部分⼯作都是对数据库中相应的表进⾏CRUD操作,也就意味着⼤多数的DAO做着相同的⼯作,只是⼯作的对象不同⽽以,于是我们可以采取继承和模板的⽅法来简化我们的⼯作,我们创建⼀个⼀BaseDAO其中实现了基本的CRUD操作,然后让其他的DAO来继承这个基类,这样相同的CRUD操作我们直接使⽤⽗类的⽅法就可以了,这在⼀定的程度上可以简化我们的⼯作量,下⾯列出⼀个⾃⼰的BaseDAO的接⼝与抽象类的实现,publicinterfaceBaseDAO<T>{TqueryById(Stringid);List<T>queryAll();voidinsert(Tt);voiddelete(Tt);voidupdate(Tt);}12345678然后我们在数据库中创建⼀个User表,对应的EJB如下,User.java,publicabstractclassBaseDAOImpl<T>implementsBaseDAO<T>{privateClass<T>entityClass;publicBaseDAOImpl(Class<T>clazz){@Overridepublicvoidinsert(Tt){publicvoiddelete(Tt){sessionFactory.getCurrentSession().delete(t);}@Overridepublicvoidupdate(Tt){sessionFactory.getCurrentSession().update(t);}@SuppressWarnings("unchecked")@OverridepublicTqueryById(Stringid){return(T)sessionFactory.getCurrentSession().getthis.entityClass=clazz;}@AutowiredprivateSessionFactorysessionFactory;sessionFactory.getCurrentSession().save(t);}@Override(entityClass,id);}@OverridepublicList<T>queryAll(){sessionFactory.getCurrentSession().createCriteria(entityClass);Criteriacriteria=returncriteria.list();}}1234567891011121314151617181920212223242526272829303132333435363738DAO层的接⼝UserDAO.java如下,当然因为BaseDAO⽐较简单,不能完成你全部的功能,你也可以在UserDAO下新添⼀些特定的⽅法,UserDAOImpl.java如下,如果你在接⼝中添加了新的⽅法别忘了在这⾥实现,@Entity@TablepublicclassUserimplementsSerializable{@IdprivateStringuserId;privateStringuserName;privateintuserLevel;privateintuserExperience;privateStringuserPassword;publicintgetUserExperience(){returnuserExperience;}publicvoidsetUserExperience(intuserExperience){this.userExperience=returnuserId;}publicvoidsetUserId(StringreturnuserLevel;}publicvoidthis.userName=userName;}userExperience;}publicStringgetUserId(){userId){this.userId=userId;}publicintgetUserLevel(){setUserLevel(intuserLevel){this.userLevel=userLevel;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){publicStringgetUserPassword(){returnuserPassword;}publicvoidsetUserPassword(Stringthis.userPassword=userPassword;}}userPassword){123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051publicinterfaceUserDAOextendsBaseDAO<User>{}123在这⾥我们只补全⽗类中的构造⽅法,我们就可以使⽤⽗类中定义的CRUD操作了,省去了实现的过程,是不是少了很多的⼯作呢。下⾯我们来测试⼀下我们通过⽗类继承的CRUD操作是否能正常使⽤呢?过程和第⼀部分⼀样,⾸先在要测试的类名字处右击,选择创建测试类,⽣成的测试类加上我们之前说的必要声明之后,应该是这样的,(如果发现没有⽗类的⽅法,记得勾选ShowInheritedMethods哦)在相应的测试⽅法下添加对应的操作,来测试⼀下通过继承BaseDAO的CRUD的实现是否可以正常的运⾏吧,不过要注意的有两点:1.console中出现了SQL语句并不代表顺利的执⾏了,因为可能存在异常导致事物回滚2.在JUnit接合Spring配置
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《粒度测量方法》课件
- 市政工程管桩施工协议
- 文化设施合同管理:丰富文化生活
- 水上乐园玻璃滑道施工合同
- 烟草种植园餐饮服务合同
- 陶瓷幕墙保温施工合同
- 市政工程招投标文件审核细则
- 租赁公司水暖系统维修协议
- 融资贷款代还责任书
- 设备维护工程师聘用合同样本
- 消毒供应室消毒员培训
- 体育场馆照明解决方案
- 团购被子合同范例
- 2024-2030年中国脱模剂行业现状动态与应用前景预测报告
- 2024年辅警招考时事政治考题及答案(168题)
- 2024年广西普法云平台考试答案
- 2024年高考物理复习试题分类训练:动量(教师卷)
- 2023年中国华电集团有限公司招聘考试真题
- 煤矿安全生产标准化题库(含答案)-7
- 2024年度事业单位招聘考试计算机基础知识复习题库及答案(共800题)
- 绿色金融发展现状及未来趋势分析图表
评论
0/150
提交评论