- 浏览: 1517819 次
- 性别:
- 来自: 厦门
博客专栏
-
Spring 3.x企业实...
浏览量:461711
文章分类
最新评论
-
JyeChou:
学习Spring必学的Java基础知识(1)----反射 -
hhzhaoheng:
...
《Spring4.x企业应用开发实战》光盘资料下载 -
renlongnian:
//assertReflectionEquals(user1, ...
单元测试系列之3:测试整合之王Unitils -
骑着蜗牛超F1:
huang_yong 写道我的经验是,只需定义三层:1.ent ...
Spring的事务管理难点剖析(2):应用分层的迷惑 -
wangyudong:
工具地址貌似更新了哦https://github.com/Wi ...
几种常用的REST webservice客户端测试工具
在开发基于Spring的应用时,如果你还直接使用Junit进行单元测试,那你就错过了Spring为我们所提供的饕餮大餐了。使用Junit直接进行单元测试有以下四大不足:
1)导致多次Spring容器初始化问题
根据JUnit测试方法的调用流程,每执行一个测试方法都会创建一个测试用例的实例并调用setUp()方法。由于一般情况下,我们在setUp()方法中初始化Spring容器,这意味着如果测试用例有多少个测试方法,Spring容器就会被重复初始化多次。虽然初始化Spring容器的速度并不会太慢,但由于可能会在Spring容器初始化时执行加载Hibernate映射文件等耗时的操作,如果每执行一个测试方法都必须重复初始化Spring容器,则对测试性能的影响是不容忽视的;
-->使用Spring测试套件,Spring容器只会初始化一次!
2)需要使用硬编码方式手工获取Bean
在测试用例类中我们需要通过ctx.getBean()方法从Spirng容器中获取需要测试的目标Bean,并且还要进行强制类型转换的造型操作。这种乏味的操作迷漫在测试用例的代码中,让人觉得烦琐不堪;
-->使用Spring测试套件,测试用例类中的属性会被自动填充Spring容器的对应Bean
,无须在手工设置Bean!
3)数据库现场容易遭受破坏
测试方法对数据库的更改操作会持久化到数据库中。虽然是针对开发数据库进行操作,但如果数据操作的影响是持久的,可能会影响到后面的测试行为。举个例子,用户在测试方法中插入一条ID为1的User记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例失败。所以应该既能够完成功能逻辑检查,又能够在测试完成后恢复现场,不会留下“后遗症”;
-->使用Spring测试套件,Spring会在你验证后,自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题!
4)不方便对数据操作正确性进行检查
假如我们向登录日志表插入了一条成功登录日志,可是我们却没有对t_login_log表中是否确实添加了一条记录进行检查。一般情况下,我们可能是打开数据库,肉眼观察是否插入了相应的记录,但这严重违背了自动测试的原则。试想在测试包括成千上万个数据操作行为的程序时,如何用肉眼进行检查?
-->只要你继承Spring的测试套件的用例类,你就可以通过jdbcTemplate在同一事务中访问数据库,查询数据的变化,验证操作的正确性!
Spring提供了一套扩展于Junit测试用例的测试套件,使用这套测试套件完全解决了以上四个问题,让我们测试Spring的应用更加方便。现在我的项目中已经完成摒弃Junit,而采用Spring的测试套件,确实带来了很大的便利。严重推荐Springer使用这个测试套件。这个测试套件主要由org.springframework.test包下的若干类组成,使用简单快捷,方便上手。
注:以上四个不足的总结摘自《精通Spring 2.x --企业应用开发详解》
评论
14 楼
lsk
2008-03-15
引用
3)数据库现场容易遭受破坏
测试方法对数据库的更改操作会持久化到数据库中。虽然是针对开发数据库进行操作,但如果数据操作的影响是持久的,可能会影响到后面的测试行为。举个例子,用户在测试方法中插入一条ID为1的User记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例失败。所以应该既能够完成功能逻辑检查,又能够在测试完成后恢复现场,不会留下“后遗症”;
-->使用Spring测试套件,Spring会在你验证后,自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题!
测试方法对数据库的更改操作会持久化到数据库中。虽然是针对开发数据库进行操作,但如果数据操作的影响是持久的,可能会影响到后面的测试行为。举个例子,用户在测试方法中插入一条ID为1的User记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例失败。所以应该既能够完成功能逻辑检查,又能够在测试完成后恢复现场,不会留下“后遗症”;
-->使用Spring测试套件,Spring会在你验证后,自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题!
可以使用内存数据库
13 楼
xmx0632
2008-03-15
hrtc 写道
有没有具体实例代码,支不支持增量测试,下面是我用junit的测试,也只要加载一次
//TestSuite public class AllTests { private static ApplicationContext context; public static Test suite() { //初始化spring String[] configLocations = {"WebRoot/WEB-INF/spring-action.xml","WebRoot/WEB-INF/spring-service.xml","WebRoot/WEB-INF/spring-dao.xml"}; context = new FileSystemXmlApplicationContext(configLocations); CommonServiceImplTest.setCommonService(context); TestSuite suite = new TestSuite("Test for com.hrtc.testcase"); // $JUnit-BEGIN$ suite.addTestSuite(CommonServiceImplTest.class); // $JUnit-END$ return suite; } } //TestCase public class CommonServiceImplTest extends TestCase { private static ICommonService commonService; /** * 获得spring context * @param context */ public static void setCommonService(ApplicationContext context){ commonService = (ICommonService) context.getBean("commonService"); } @Test public void testGetAdminByLoginName() { try { Admin admin = commonService.getAdminByLoginName("hrtc"); System.out.println("loginname:"+admin.getLoginName()); } catch (CommonException e) { e.printStackTrace(); } } @Test public void testCheckUserExist(){ try { System.out.println("check admin hrtc is exist or not"); boolean exist = commonService.checkUserExist("hrtc",true); System.out.println(exist); System.out.println("check user hrtc is exist or not"); exist = commonService.checkUserExist("hrtc",false); System.out.println(exist); } catch (CommonException e) { e.printStackTrace(); this.fail("验证用户是否存在失败"); } } }
ajoo 写道
Spring那个不叫“单元”测试。
12 楼
hrtc
2008-03-14
有没有具体实例代码,支不支持增量测试,下面是我用junit的测试,也只要加载一次
//TestSuite public class AllTests { private static ApplicationContext context; public static Test suite() { //初始化spring String[] configLocations = {"WebRoot/WEB-INF/spring-action.xml","WebRoot/WEB-INF/spring-service.xml","WebRoot/WEB-INF/spring-dao.xml"}; context = new FileSystemXmlApplicationContext(configLocations); CommonServiceImplTest.setCommonService(context); TestSuite suite = new TestSuite("Test for com.hrtc.testcase"); // $JUnit-BEGIN$ suite.addTestSuite(CommonServiceImplTest.class); // $JUnit-END$ return suite; } } //TestCase public class CommonServiceImplTest extends TestCase { private static ICommonService commonService; /** * 获得spring context * @param context */ public static void setCommonService(ApplicationContext context){ commonService = (ICommonService) context.getBean("commonService"); } @Test public void testGetAdminByLoginName() { try { Admin admin = commonService.getAdminByLoginName("hrtc"); System.out.println("loginname:"+admin.getLoginName()); } catch (CommonException e) { e.printStackTrace(); } } @Test public void testCheckUserExist(){ try { System.out.println("check admin hrtc is exist or not"); boolean exist = commonService.checkUserExist("hrtc",true); System.out.println(exist); System.out.println("check user hrtc is exist or not"); exist = commonService.checkUserExist("hrtc",false); System.out.println(exist); } catch (CommonException e) { e.printStackTrace(); this.fail("验证用户是否存在失败"); } } }
11 楼
hantsy
2008-03-11
还是看这里吧
http://www.infoq.com/articles/testing-in-spring
http://www.infoq.com/articles/testing-in-spring
10 楼
雁行
2008-03-10
skydream 写道
1)导致多次Spring容器初始化问题
这个有个简单的方法解决,我原来遇到过类似的问题,测试action或者service时,因为我的代码是需要先启动连接池的。
当时解决的方法非常简单,给所有测试案例都来一个基类,然后在setup()方法中初始化连接池,为了防止每个TestCase都重新执行一遍连接池初始化,给这个基类设置一个static的标志位
代码类似:
这个有个简单的方法解决,我原来遇到过类似的问题,测试action或者service时,因为我的代码是需要先启动连接池的。
当时解决的方法非常简单,给所有测试案例都来一个基类,然后在setup()方法中初始化连接池,为了防止每个TestCase都重新执行一遍连接池初始化,给这个基类设置一个static的标志位
代码类似:
public class AbstarctTestCase extends TestCase { private static boolean inited = false; public void setup() { super.setup(); if (!inited) { init(); inited = true; } } }
或者把上下文在基类里做成单态的,呵呵,差不多的做法
9 楼
stamen
2008-01-02
downpour 写道
Spring提供的测试基类是用于做DAO或者Service层的集成测试的,而不是单元测试,单元测试可以使用JMock等来Mock相应的接口。
Spring提供的一些测试基类有个问题,就是无法针对某个方法进行测试,一旦进行测试,会对这个类中所有以test开口的方法都跑一遍。
Spring提供的一些测试基类有个问题,就是无法针对某个方法进行测试,一旦进行测试,会对这个类中所有以test开口的方法都跑一遍。
Spring可以只测试某个测试方法吧,在Eclipse中是可以的啊,你说是承继吧个基类不行呢?
8 楼
紧急下潜
2008-01-02
ajoo 写道
Spring那个不叫“单元”测试。
正解
7 楼
hantsy
2008-01-02
继承spring-mock包中的Spring测试基类,以上问题都不是问题了。
6 楼
Godlikeme
2007-12-31
一般把需要环境依赖(getBean)、数据依赖(getData)的测试叫做集成测试(模块内或模块间集成测试),而不是单元测试。
5 楼
ajoo
2007-12-31
Spring那个不叫“单元”测试。
4 楼
xyz20003
2007-12-31
spring-mock是继承自junit的,提供的功能有:
只初始化一次ctx,然后所有testCase根据key公用缓存的ctx。
提供自动依赖注入xml中定义的bean,当然,你要在testCase里写对应的setter。
提供事务和自动回滚,不会对数据库内的数据造成损坏,要是需要修改数据库,需要手工提交。
然后还有一大堆的mock类,像MockHttpServletRequest一类的,比easymock什么的好用多了。推荐一定要用一下。
只初始化一次ctx,然后所有testCase根据key公用缓存的ctx。
提供自动依赖注入xml中定义的bean,当然,你要在testCase里写对应的setter。
提供事务和自动回滚,不会对数据库内的数据造成损坏,要是需要修改数据库,需要手工提交。
然后还有一大堆的mock类,像MockHttpServletRequest一类的,比easymock什么的好用多了。推荐一定要用一下。
3 楼
downpour
2007-12-31
Spring提供的测试基类是用于做DAO或者Service层的集成测试的,而不是单元测试,单元测试可以使用JMock等来Mock相应的接口。
Spring提供的一些测试基类有个问题,就是无法针对某个方法进行测试,一旦进行测试,会对这个类中所有以test开口的方法都跑一遍。
Spring提供的一些测试基类有个问题,就是无法针对某个方法进行测试,一旦进行测试,会对这个类中所有以test开口的方法都跑一遍。
2 楼
skydream
2007-12-30
Spring提供了一套扩展于Junit测试用例的测试套件
这个是全新的和junit没有任何联系,还是基于junit?
这个是全新的和junit没有任何联系,还是基于junit?
1 楼
skydream
2007-12-30
1)导致多次Spring容器初始化问题
这个有个简单的方法解决,我原来遇到过类似的问题,测试action或者service时,因为我的代码是需要先启动连接池的。
当时解决的方法非常简单,给所有测试案例都来一个基类,然后在setup()方法中初始化连接池,为了防止每个TestCase都重新执行一遍连接池初始化,给这个基类设置一个static的标志位
代码类似:
这个有个简单的方法解决,我原来遇到过类似的问题,测试action或者service时,因为我的代码是需要先启动连接池的。
当时解决的方法非常简单,给所有测试案例都来一个基类,然后在setup()方法中初始化连接池,为了防止每个TestCase都重新执行一遍连接池初始化,给这个基类设置一个static的标志位
代码类似:
public class AbstarctTestCase extends TestCase { private static boolean inited = false; public void setup() { super.setup(); if (!inited) { init(); inited = true; } } }
发表评论
-
一个常见的Spring IOC疑难症状
2013-07-25 14:14 4958Case 请看下面的IOC实例: 1)Aa ... -
mybatis3.1分页自动添加总数
2013-07-08 21:11 22708问题 1.mybatis默认分页是内存分页的,谁用谁崩溃啊! ... -
学习Spring必学的Java基础知识(9)----HTTP请求报文
2012-06-09 16:02 13865引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
学习Spring必学的Java基础知识(4)----XML基础知识
2012-05-12 15:33 8486引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(3)----PropertyEditor
2012-05-12 15:13 16760引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(2)----动态代理
2012-05-02 13:03 9613引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(1)----反射
2012-04-25 13:57 89561引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
透透彻彻IoC(你没有理由不懂!)
2012-04-18 11:01 94047引述:IoC(控制反转:I ... -
单元测试系列之5:使用unitils测试Service层
2012-04-14 10:48 18325引述:Spring 的测试框架为我们提供一个强大的测试环境,解 ... -
如何用Spring读取JAR中的文件
2012-04-13 17:22 18286使用如下方式读取JAR中的文件出错 类路径下 ... -
单元测试系列之3:测试整合之王Unitils
2012-04-09 14:11 15534引述:程序测试对保障应用程序正确性而言,其重要性怎么样强调都不 ... -
单元测试系列之1:开发测试的那些事儿
2012-03-28 12:52 9954引述:程序测试对保障应用程序正确性而言,其重要性怎 ... -
单元测试的那些事儿
2012-03-28 12:48 2------------------------------- ... -
Spring 3.0的新功能
2012-03-26 09:30 71222009年9月发布Spring ... -
Spring的事务管理难点剖析(7):数据连接泄漏
2012-03-07 10:53 6759底层连接资源的访问问题 对于应用开发者来说,数据连接泄 ... -
Spring的事务管理难点剖析(6):特殊方法成漏网之鱼
2012-03-07 09:28 4496哪些方法不能实施Spring ... -
Spring的事务管理难点剖析(5):联合军种作战的混乱
2012-03-07 09:10 7808Spring事务管理器的应对 Spring抽象的DA ... -
Spring的事务管理难点剖析(4):多线程的困惑
2012-03-06 17:30 16849Spring通过单实例化Bean简化多线程问题 由于 ... -
Spring的事务管理难点剖析(3):事务方法嵌套调用的迷茫
2012-03-06 17:23 10526Spring事务传播机制回顾 ... -
Spring的事务管理难点剖析(2):应用分层的迷惑
2012-03-06 16:59 5041Web、Service及DAO三 ...
相关推荐
在java web应用中,通过mock技术可以模拟spring容器,从而进行单元测试,详细可以参见本文
这是一个Spring Boot Maven演示应用程序,展示了如何使用JUnit和Mockito Framework对Sprig Boot RESTful服务执行完整性和模拟测试。 先决条件 Java SE开发套件8 Maven 3.0+ H2内存数据库(可以与任何其他关系...
第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。 第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...
Spring Test & Spring Boot Test:为 Spring Boot 应用提供集成测试和工具支持 AssertJ:支持流式断言的 Java 测试框架 Hamcrest:一个匹配器库 Mockito:一个 java mock 框架 JSONassert:一个针对 JSON 的断言...
实现最简单的spring框架的搭建,由详细的文档说明,通过junit测试来运行,查看结果.
3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的封装,spring-tx里没有JotmFactoryBean.class,我在jar里添加了类) 2)Demo 导入说明: 1.Eclipse ...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...
@RunWith(SpringJUnit4ClassRunner.class)//Spring的Junit测试,会在测试开始时,创建Spring的应用上下文 @ContextConfiguration(classes=CDPlayerSpringConfig.class)//表明配置类 public class SpringTest1 { //...
从JUnit 4迁移。 依赖注入。 动态测试。 测试界面。 测试模板。 参数化测试。 并行执行。 有序的测试。 此外,还通过示例详细说明了与第三方框架和技术的集成: Mockito(流行的模拟框架)。 Spring...
让我们在开发中以及开发后期进行测试时,直接使用Junit结合spring一起测试。 本套课程中,我们将全面剖析Spring和SpringMVC两个部分。从应用场景分析,到基本用法的入门案例,再到高级特性的分析及使用,最后是执行...
springboot-junit 它将演示如何在Spring Boot应用程序中实现junit测试用例
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在...
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在...
zoopaz-spring-web 示例 Spring 4 J2EE 7 maven Web 应用程序模板项目。 页面是使用带有 ThymeLeaf 模板的 Spring MVC 生成的。 包括 jUnit 测试和 slf4j 日志记录。
smpp-server-mock随附: 模拟SMPP服务器 Junit 5扩展 Spring Boot Starter在应用程序启动之前启动模拟服务器MockSmppBootstrapConfiguration 核心SMPP服务器对象的AssertJ断言 核smpp-server-mock-core包含两个主要...
tut-spring-boot-kotlin:使用Spring Boot和Kotlin构建Web应用程序::了解如何使用Spring,Kotlin,Junit 5和JPA轻松构建和测试Web应用程序
方便程序的测试 Spring提供了对Junit4的支持,可以通过注解方便的测试Spring程序。 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等...
Junit测试: 基本注释测试 ClassPropertyTest Exception1Test Exception2Test ExecutionOrderTest ListTestInteger ListTestObject 忽略测试 ListTestString MapTest 超时测试 Mockito测试: 在服务层中...
spring-test.jar:对JUNIT等测试框架的简单封装 spring-tx.jar:为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。 spring-webmvc-portlet.jar:Spring MVC的增强 spring-websocket.jar: