数据结构该怎么复习才是

使用JUnit4对SSH2框架Service/Dao层进行单元测试 - 推酷
使用JUnit4对SSH2框架Service/Dao层进行单元测试
JUnit是一个非常好用的测试框架,但在对SSH架构的Java代码中需要注入由Spring管理的Bean,下面就简单介绍一下使用JUnit4对SSHSSH2框架Service/Dao层进行单元测试的方法。
在建立JUnit Test Case 测试类时,勾选setUpBeforeClass,我们需要在setUpBeforeClass()类中加载Spring配置文件。其它步骤和一般的Java测试过程一样(添加测试类的名称,选择需要测试的类和要测试的方法)。
建立好测试类后在setUpBeforeClass()&类中添加ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{&src/applicationContext.xml&});来加载配置文件,注意配置文件的路径(根据自己的配置文件位置选择)。然后使用context.getBean()获取对象。
public class testService
public static EnterpriseinfoServiceI
@BeforeClass
public static void setUpBeforeClass() throws Exception
System.out.println(&加载配置文件……&);
ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{&src/applicationContext.xml&});
System.out.println(&加载配置文件成功&);
service = (EnterpriseinfoServiceImpl) context.getBean(&enterpriseinfoService&); //enterpriseinfoService为applicationContext.xml配置文件中Service类对象id值
public void testSave()
Enterpriseinfo info = new Enterpriseinfo();
info.setEnglishabbreviation(&Myenglishname&);
info.setEnglishfullname(&myenglishfullname&);
info.setEnterpriseabbreviation(&enterpriseabbreviation&);
info.setEnterprisefullname(&enterprisefullname&);
info.setStockcode(12434);
info.setId(3);
service.save(info);
} catch (Exception e)
e.printStackTrace();
注意:该测试方法测试后数据并不会自动回滚
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致人气:3583862
访问用户量:3983
笔记经验:
总积分:261656
级别:VIP5
搜索本笔记
ta的交流分类
ta的全部笔记
浏览(10030)|(0)
&&交流分类:|笔记分类:
引述:Spring 的测试框架为我们提供一个强大的测试环境,解决日常单元测试中遇到的大部分测试难题:如运行多个测试用例和测试方法时,Spring上下文只需创建一次;数据库现场不受破坏;方便手工指定Spring配置文件、手工设定Spring容器是否需要重新加载等。但也存在不足的地方,基本上所有的Java应用都涉及数据库,带数据库应用系统的测试难点在于数据库测试数据的准备、维护、验证及清理。Spring 测试框架并不能很好地解决所有问题。要解决这些问题,必须整合多方资源,如DbUnit、Unitils、Mokito等。其中Unitils正是这样的一个测试框架。&使用unitils测试Service层&&& 在进行服务层的测试之前,我们先来认识一下需要测试的UserServiceImpl服务类。UserServiceImpl服务类中拥有一个处理用户登录的服务方法,其代码如下所示。&&& UserService.java&
package&com.baobaotao.&&
import&com.baobaotao.domain.LoginL&&
import&com.baobaotao.domain.U&&
import&com.baobaotao.dao.UserD&&
import&com.baobaotao.dao.LoginLogD&&
@Service(&userService&)&&
public&class&UserServiceImpl&implements&UserService&{&&
@Autowired&&
&&&&private&UserDao&userD&&
@Autowired&&
&&&&private&LoginLogDao&loginLogD&&
&&&&public&void&loginSuccess(User&user)&{&&
&&&&&&&&user.setCredits(&5&+&user.getCredits());&&
&&&&&&&&LoginLog&loginLog&=&new&LoginLog();&&
&&&&&&&&loginLog.setUserId(user.getUserId());&&
&&&&&&&&loginLog.setIp(user.getLastIp());&&
&&&&&&&&loginLog.setLoginTime(user.getLastVisit());&&
&&&&&&&&&userDao.updateLoginInfo(user);&&
&&&&&&&&&loginLogDao.insertLoginLog(loginLog);&&
&&&&}&&&&&
&& UserServiceImpl需要调用DAO层的UserDao和LoginLogDao以及User和LoginLog这两个PO完成业务逻辑,User和LoginLog分别对应t_user和t_login_log这两张数据库表。&&& 在用户登录成功后调用UserServiceImpl中的loginSuccess()方法执行用户登录成功后的业务逻辑。&
[1]& 登录用户添加5个积分(t_user.credits)。&
[2]& 将登录用户的最后访问时间(t_user.last_visit)和IP(t_user.last_ip)更新为当前值。&
[3]& 在日志表(t_login_log)中为用户添加一条登录日志。&
这是一个需要访问数据库并存在数据更改操作的业务方法,它工作在事务环境下。下面是装配该服务类Bean的Spring配置文件。&& baobaotao-service.xml&
&version=&1.0&&encoding=&UTF-8&&&&
&xmlns=&http://www.springframework.org/schema/beans&&&
&&&&xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&xmlns:tx=&http://www.springframework.org/schema/tx&&&
&&&&xmlns:context=&http://www.springframework.org/schema/context&&&
&&&&xmlns:p=&http://www.springframework.org/schema/p&&&
&&&&xmlns:aop=&http://www.springframework.org/schema/aop&&&
&&&&xsi:schemaLocation=&&&
&&&&&http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&&
&&&&&http://www.springframework.org/schema/context&http://www.springframework.org/schema/context/spring-context-3.0.xsd&&
&&&&&http://www.springframework.org/schema/aop&http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&&
&&&&&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&&&
&&&&&base-package=&com.baobaotao.service&&&
&&&&&id=&transactionManager&&&
&&&&&&&&class=&org.springframework.jdbc.datasource.DataSourceTransactionManager&&&
p:dataSource-ref=&dataSource&&&&
&&&&&&&&&id=&jdbcServiceMethod&&&
&&&&&&&&&&&&expression=&&within(com.baobaotao.service..*)&&&&
&&&&&&&&&pointcut-ref=&jdbcServiceMethod&&advice-ref=&jdbcTxAdvice&&&&
&&&&&&id=&jdbcTxAdvice&&transaction-manager=&transactionManager&&&
&&&&&&&&&&
&&&&&&&&&&&&&name=&*&&&
&&&&&&&&&&
&& UserServiceImpl所关联的DAO类和PO类都比较简单,这里就不一一列出,读者可以参考本文附带光盘中的实例代码。在着手测试UserServiceImpl之前,需要先创建数据库表,相应的SQL脚本文件位于:D:\masterSpring\Chapter 16\schema目录下。&&& 下面我们为UserServiceImpl编写一个简单的测试用例类,此时的目标是让这个基于Unitils测试框架的测试类运行起来,并联合Mockito框架创建Dao模拟对象。首先编写测试UserService#findUserByUserName()方法的测试用例,如代码清单16-37所示:&&& UserServiceTest.java&
package&com.baobaotao.&&
import&org.unitils.UnitilsJUnit4;&&
import&org.unitils.spring.annotation.SpringApplicationC&&
import&org.springframework.test.util.ReflectionTestU&&
import&org.unitils.spring.annotation.SpringB&&
import&org.junit.T&&
import&com.baobaotao.domain.U&&
import&java.util.D&&
@SpringApplicationContext({&baobaotao-service.xml&,&&baobaotao-dao.xml&})&&&
public&class&UserServiceTest&extends&UnitilsJUnit4{&&
private&UserDao&userD&&&
private&LoginLogDao&loginLogD&&
@Before&&&
public&void&init(){&&
&&&&userDao&=&mock(UserDao.class);&&
&&&&loginLogDao&=&mock(LoginLogDao.class);&&
&&&&@Test&&&&
&&&&public&void&findUserByUserName()&{&&
&&&&&&&&&User&user&=&new&User();&&
&&&&&&&&&user.setUserName(&tom&);&&
&&&&&&&&&user.setPassword(&1234&);&&
&&&&&&&&&user.setCredits(100);&&
&&&&&&&&&doReturn(user).when(userDao).findUserByUserName(&tom&);&&&
&&&&&&&&&UserServiceImpl&userService&=&new&UserServiceImpl();&&
&&&&&&&&&ReflectionTestUtils.setField(userService,&&userDao&,&userDao);&&
&&&&&&&&&&
&&&&&&&&&User&u&=&userService.findUserByUserName(&tom&);&&
&&&&&&&&&assertNotNull(u);&&
&&&&&&&&&assertThat(u.getUserName(),equalTo(user.getUserName()));&&
&&&&&&&&&&verify(userDao,times(1)).findUserByUserName(&tom&);&&
&& 这里,我们让UserServiceTest直接继承于Unitils所提供的UnitilsJUnit4的抽象测试类,该抽象测试类的作用是让Unitils测试框架可以在JUnit 测试框架基础上运行起来。在①处,标注了一个类级的@SpringApplicationContext注解,这里Unitils将从类路径中加载Spring配置文件,并使用该配置文件启动Spring容器。在③处通过Mockito创建两个模拟DAO实例。在④-1处模拟测试数据并通过Mockito录制UserDao#findUserByUserName()行为。在④-2处实例化用户服务实例类,并在④-3处通过Spring测试框架提供的工具类org.springframework.test.util.ReflectionTestUtils为userService私有属性userDao赋值(ReflectionTestUtils是一个访问测试对象中私有属性非常好用的工具类)。在④-4处调用服务UserService#findUserByUserName()方法,并验证返回结果。在④-5处通过Mockito验证模拟userDao对象是否被调用,且只调用一次。最后在IDE中执行UserServiceTest测试用例,测试结果如图16-15所示。&&& 从运行结果可以看出,我们已成功对UserServceTest.findUserByUserName()执行单元测试。下面我们通过Unitils提供的@DataSet注解来准备测试数据,并测试UserService# loginSuccess ()方法。BaobaoTao.SaveUsers.xls数据集如图16-16所示。&&& 准备好了测试数据集之后,就可以开始为UserServiceImpl编写测试用例类,此时的目标是通过Unitils提供的@DataSet注解准备测试数据,来保证测试数据的独立性,避免手工通过事务回滚维护测试数据的状态。测试UserService#loginSuccess ()方法的代码如下所示。&&& 代码清单16 38& UserServiceTest.java&
package&com.baobaotao.&&
import&org.unitils.UnitilsJUnit4;&&
import&org.unitils.spring.annotation.SpringApplicationC&&
import&org.unitils.spring.annotation.SpringB&&
import&org.junit.T&&
import&com.baobaotao.domain.U&&
import&java.util.D&&
@SpringApplicationContext({&baobaotao-service.xml&,&&baobaotao-dao.xml&})&&&
public&class&UserServiceTest&extends&UnitilsJUnit4{&&
&&&&@SpringBean(&userService&)&&
&&&&private&UserService&userS&&
&&&&@DataSet(&BaobaoTao.SaveUsers.xls&)&&
&&&&public&void&loginSuccess()&{&&
&&&&&&&&User&user&=&userService.findUserByUserName(&tom&);&&&
&&&&&&&&Date&now&=&new&Date();&&
&&&&&&&&user.setLastVisit(now);&&&
&&&&&&&&&userService.loginSuccess(user);&&&
&&&&&&&&&User&u&=&userService.findUserByUserName(&tom&);&&
&&&&&&&&&assertThat(u.getCredits(),is(105));&&&
&&&&}&&&&&
&& 在①处通过加载Unitils的@SpringApplicationContext 注解加载Spring配置文件,并初始化Spring容器。在②处通过@ SpringBean注解从Spring容器中获取UserService实例。在③处通过@DataSet注解从当前测试用例所在类路径中加载BaobaoTao.SaveUsers.xls数据集,并将数据集中的数据保存到测试数据库相应的表中。从上面的数据集中可以看出,我们为t_user表准备了两条用户信息测试数据。在④-1处从测试数据库中获取“tom”用户信息,模拟当前登录的用户。在④-2处设置当前“tom”用户的登录时间。在④-3处调用UserService#loginSuccess()方法,更新“tom”用户积分,并持久化到测试数据库中。在⑤处,验证“tom”用户当前积分是否是105分。完成测试用例的编写,最后在IDE中执行UserServiceTest测试用例,测试结果如图16-17所示。&&&& 从运行结果可以看出,我们已成功对UserServce#loginSuccess()执行单元测试。重复执行当前单元测试,测试结果仍然通过。细心的读者可能会有疑问,没有UserServce# loginSuccess()测试方法实施事务回滚,执行多次之后“tom”用户的积分不应该是105分,那为何测试还是通过呢?这是因为Unitils帮我们维护测试数据库中的数据状态,Unitils这个强大的魔力,归根于Unitils强大的数据集更新策略。到此我们成功完成UserServce单元测试。从上面为用户服务UserServce编写两个测试方法可以看出,对service层的测试,我们既可以采用JUnit+Unitils+Mockito组合,运用Mockito强大的模块能力,完成service层独立性测试,也可以采用JUnit+Unitils+Dbunit组合,运用Dbunit强大的数据库维护能力,完成service层+DAO层集成测试。&
提示:在实际项目中,我们只对DAO做集成测试,在对Service层测试中,对所有的DAO都用Mockito模拟,也即只对Service层单元测试。
转载自《Spring 3.x企业实用开发实战》&
作者博客:
作者介绍:&&老程序员一枚,做了10的Java开发,对Spring,Oracle,云计算,敏捷开发感兴趣。是中图一购网的联合创始人之一。
购买地址:
相关笔记推荐
精品视频课程推荐
达到能综合使用Struts2+Spring3+Hibernate3+Jbpm4来进行实际项目开发的能力。
包括:ssh和jbpm的整合;数据字典;通用DAO(Spring+Hibernate+泛型+反射+SpEL+模板方法模式);自动生成UUID的加强版;分层开发、SSH联合的基本开发;翻页的示范真实值和表现值,数据参照的实现;文件上传下载;主子表操;登录验证码;登录控制的拦截器
内容概述:本课程专注于构建:高可扩展性、高性能、大数据量、高并发、分布式的系统架构。
从零开始、全面系统、成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能。
技术要点:
1:构建基本的业务功能块,基于Maven+Git+Spring mvc+spring+mybatis+ehcache+mysql+X-gen代码生成
&2:高扩展性的分布式体系架构(基于Nginx+Varnish+Memcache+ActiveMQ)
&3:NoSQL的合理使用和架构优化(基于MongoDB)
&4:分布式文件存储和架构优化(基于MogileFS)
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识
JUnit4的基本使用;在maven环境下使用JUnit;用JMock来模拟测试对象要依赖的对象;用cobertura实现覆盖测试;用hundson实现持续集成;JUnit3的基本使用。
系统、完整的学习Spring Data JPA开发的知识。包括:Spring Data JPA入门;JpaRepository基本功能 ;JpaRepository的查询;客户化扩展JpaRepository;Specifications查询。
浏览(10030)|(0)
&&交流分类:|笔记分类:
版权所有 Copyright(C) 私塾在线学习网问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
比添加用户,我要先检查用户是否存在,这个是放在哪个层好?
如果放在dao或者service层,异常要每层都写?如果是放在controller,那每一个要用到的地方都需要先检查?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果你真的分了3个层去做而且要严格的要求必须分层写!那么应该放到service,因为添加用户前检查这个用户是否存在这是业务逻辑,但实际上大多数可能都不是这样做的,其实没有什么对不对的,框架设计出来是给人用起来便利准备的,不要太拘泥了。不过如果是公司的项目规范那就没办法了,每层可能都是不同组的人去开发,必须分配清楚
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
个人认为应该是放在controller,数据的检验越早越好,避免程序做无用功,并且你可以把检验抽成一个方法,需要的地方调用一下这个方法就好了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这个其实还是需要,看具体的需求的。
当你这个Service需要提供给外部模块调用的话,那么校验是需要放在Service层的。
但是如果是本模块调用,并且调用的地方只有一个,那么在controller校验一下就好了。
还有就是需要考虑这个Service调用的频率高不高。举个例子,如果这个Service是单独部署在一台服务器上的,而且调用这个Service很频繁,并且这个校验很耗性能,那么可以考虑把这些校验放在客户端而不是服务端。
个人观点。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
参数是controller里接收的,直接验证完事了,如果再service里验证,还要把接收的参数传过去,就绕远了;
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 AppJfinal 怎么对service层做单元测试呢,
看到这篇文章介绍了对congtroller做单元测试 那对sevice层怎么做单元测试呢
我再junit 里面写sql查询汇报这样的空指针异常
AssignSeller.testAssignSeller (Failed Tests first)
testAssignSeller(com.canyou.AssignSeller)
java.lang.NullPointerException
at com.jfinal.plugin.activerecord.Model.find(Model.java:567)
at com.jfinal.plugin.activerecord.Model.findFirst(Model.java:594)
at com.jfinal.plugin.activerecord.Model.findFirst(Model.java:603)
at com.canyou.AssignSeller.getClient(AssignSeller.java:29)
at com.canyou.AssignSeller.testAssignSeller(AssignSeller.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
switch (sourceType) {
case 0:// 传值
case 1:// 个人邀请
// 随机邀请人
Clientbase iClient = Clientbase.dao
.findFirst("select * from crm_clientbase_tb order by rand() LIMIT 1");
client.setSourceType(1);
client.setInvitationCode(String.valueOf(iClient.getId()));
Activity act = Activity.dao.findFirst("select * from mkt_activity_tb order by rand() LIMIT 1");
client.setSourceType(2);
client.setInvitationCode(String.valueOf(act.getId()));
Organization org = Organization.dao
.findFirst("select * from crm_organization_tb order by rand() LIMIT 1");
client.setSourceType(4);
client.setInvitationCode(String.valueOf(org.getId()));
写 这样的代码 &测试会报空指针异常
在 jfinal 官网下载 jfinal 手册,看一下《5.13 任意环境下使用 ActiveRecord》这一章节,里面介绍了如何在任意环境下使用 active record plugin
--- 共有 1 条评论 ---

我要回帖

 

随机推荐