作者:江南白衣
注重实效的TDD的确能加快,而不是拖慢开发的进度(片面的追求覆盖率的全面UnitTest不在此列)
一,可以实现真正分层开发。
二,不需要依赖和频繁重启Web Container。
三,手工测试总不免改动数据库,如何把数据库恢复到测试前的状态是件伤脑筋的事情。而Unit Test可以使用自动Rollback机制,巧妙的解决了这件事情。
Spring 下的Unit Test主要关注三个方面:
1. bean的依赖注入
2. 事务控制,Open Session in Test 及默认回滚
3. 脱离WebContainer对控制层的测试
1.bean的依赖注入
能不依靠WebContainer来完成ApplicationContext的建立与POJO的依赖注入一向是Spring的得意之处。
String[]paths={"classpath:applicationContext*.xml"};
ApplicationContextctx=newClassPathXmlApplicationContext(paths);
UserDAOdao=(UserDAO)ctx.getBean("userDAO");
如果你连这也觉得麻烦,那么只要你的testCase继承于Spring-mock.jar里的AbstractDependencyInjectionSpringContextTests,实现public String[] getConfigLocations()函数, 并显式写一些需要注入的变量的setter函数。
注:因为是AutoWire的,变量名必须等于Spring context文件里bean的id。
2.Open Session in Test 及自动Rollback
又是来自Spring这个神奇国度的东西, 你可以让testCase继承于AbstractTransactionalDataSourceSpringContextTests,就可以做到Open Session in Test ,解决Hibernate的lazy-load问题;而且接管原来的DAO里的事务控制定义,通过setDefaultRollback(boolean)方法控制最后回滚还是提交,如果默认为回滚,则测试产生数据变动不会影响数据库内数据。
如果不能继承于这个基类,可以自己简单编写,代码是这样的:
protectedPlatformTransactionManagertransactionManager;
protectedTransactionStatustransactionStatus;
protectedbooleandefaultRollback=true;
publicvoidsetUp()
{
transactionManager=(PlatformTransactionManager)ctx.getBean("transactionManager");
transactionStatus=transactionManager.getTransaction(newDefaultTransactionDefinition());
}
publicvoidtearDown()
{
if(defaultRollback)
transactionManager.rollback(this.transactionStatus);
else
transactionManager.commit(this.transactionStatus);
}
(注,hibernate太奸诈了,如果全部默认回滚,只会在session里干活,一点不写数据库,达不到完全的测试效果。)
BTW.AbstractTransactionalDataSourceSpringContextTests 还通过注入的DataSource创建了一个JDBCTemplate 对象,可以跑SQL帮忙核对Hibernate的结果,但要注意两者的事务。
3.Controller层的Unit Test
controller层靠Spring提供的MockHttpServletRequest和Response来模拟真实的servlet环境,并且spring 2.0了加了一个AbstractModelAndViewTests,提供一些检测返回值的utils函数。
protectedXmlWebApplicationContextctx;
protectedMockHttpServletRequestrequest=newMockHttpServletRequest("GET","");
protectedMockHttpServletResponseresponse=newMockHttpServletResponse();
protectedControllercontroller=null;
protectedModelAndViewmv=null;
publicvoidsetUp()
{
String[]paths={"applicationContext*.xml","myappfuse-servlet.xml"};
ctx=newXmlWebApplicationContext();
ctx.setConfigLocations(paths);
ctx.setServletContext(newMockServletContext(""));ctx.refresh();
controller=(CustomerController)ctx.getBean("customerController");
//再加上前文的事务控制的代码
}
publicvoidtestCustomerList()throwsException
{
request.setRequestURI("/customer.do");
request.addParameter("action","listView");
mv=controller.handleRequest(request,response);
assertModelAttributeAvailable(mv, "customers");
}
4.进一步简化
一来这两个基类的名字都太长了。
二来有一些公共的context文件的定义。
所以可以再抽象了几个基类,分别是DAOTestCase,ControllerTestCase。
5. EasyMock
MockObject是一样彻底分层开发的好东西,而且使用上没什么难度。而且已不再存在只支持接口不支持Class的限制。
//设定BookManagerMockObject
bookManagerMockControl=MockClassControl.createControl(BookManager.class);
bookManagerMock=(BookManager)bookManagerMockControl.getMock();
controller.setBookManager(bookManagerMock);
//录制getAllBook()和getCategorys方法的期望值
bookManagerMock.getAllBook();
bookManagerMockControl.setReturnValue(newArrayList());
bookManagerMockControl.replay();
//执行操作
mv=controller.handleRequest(request,response);
//验证结果
assertModelAttributeAvailable(mv,"books");
Easy Mock VS JMock:
JMock 要求TestCase继承于MockObjectTestCase太霸道了。妨碍了我继承于Spring2.0的ModelAndViewTestCase和使用MockDao,RealDao并行的继承体系。因此采用没那么霸道的easyMock。
另外,easyMock的脚本录制虽不如jmock那么优美,但胜在简短易读。jmock那句太长了 。
6. 显示层测试
还有,显示层至今没有什么好的UnitTest方法,无论是不成才的httpUnit们还是笨重的GUI test工具。Appfuse一直用的那个ThoughtWork那个Selenium和J3Unit的效果不知如何, 其中J3Unit号称支持prototype。
分享到:
相关推荐
《Spring框架测试模块详解——基于org.springframework.test-3.0.2.RELEASE.jar》 Spring框架是Java领域中广泛使用的轻量级应用框架,它以其模块化、灵活的配置和强大的功能深受开发者喜爱。在Spring的众多模块中,...
3. **测试代码**:可能包含`src/test`目录下的JUnit测试类,使用`@RunWith(SpringRunner.class)`注解来启动Spring Test环境。 4. **pom.xml**:Maven的项目对象模型,列出了项目依赖,包括Spring框架和其他库。 5. *...
对于Web应用的测试,Spring Test提供了`MockMvc`类,可以在不启动服务器的情况下模拟HTTP请求,测试控制器的逻辑。`MockMvcBuilders`可以帮助我们构建并配置`MockMvc`实例,`mockMvc.perform()`则可以执行HTTP请求...
赠送jar包:spring-test-5.2.7.RELEASE.jar; 赠送原API文档:spring-test-5.2.7.RELEASE-javadoc.jar; 赠送源代码:spring-test-5.2.7.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-test-5.2.7.RELEASE....
【描述】"mybatis+spring+springtest 求ActionBean的ut测试" 这句话表明需求是针对ActionBean进行单元测试(Unit Testing)。ActionBean通常指的是业务逻辑层(Service Layer)的组件,它接收请求并调用DAO层来处理...
赠送jar包:spring-test-5.0.5.RELEASE.jar; 赠送原API文档:spring-test-5.0.5.RELEASE-javadoc.jar; 赠送源代码:spring-test-5.0.5.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-test-5.0.5.RELEASE....
赠送jar包:spring-test-5.0.5.RELEASE.jar; 赠送原API文档:spring-test-5.0.5.RELEASE-javadoc.jar; 赠送源代码:spring-test-5.0.5.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-test-5.0.5.RELEASE....
Spring MVC A Tutorial(2nd) 英文mobi 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
org.springframework.test-3.0.0.RELEASE.jar spring必须的jar包
标题“Java Unit Test 和 XML 类加载器”涉及的是在Java编程中进行单元测试以及XML类加载器的相关知识。这两部分是Java开发中的重要概念,尤其是对于软件质量和可维护性而言。 首先,Java Unit Test,也称为单元...
赠送jar包:spring-test-4.3.20.RELEASE.jar; 赠送原API文档:spring-test-4.3.20.RELEASE-javadoc.jar; 赠送源代码:spring-test-4.3.20.RELEASE-sources.jar; 包含翻译后的API文档:spring-test-4.3.20....
`spring-test.zip`文件包含的是关于Spring测试的相关代码示例,这对于理解和掌握Spring框架的测试支持至关重要。Spring Test模块提供了集成测试的工具,使得开发者能够方便地对Spring应用进行单元测试和集成测试。 ...
赠送jar包:spring-test-4.2.2.RELEASE.jar; 赠送原API文档:spring-test-4.2.2.RELEASE-javadoc.jar; 赠送源代码:spring-test-4.2.2.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-test-4.2.2.RELEASE....
Spring整合Junit测试时所需要的jar包。 spring-test-3.2.3.RELEASE.jar
赠送jar包:spring-test-5.3.15.jar; 赠送原API文档:spring-test-5.3.15-javadoc.jar; 赠送源代码:spring-test-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-test-5.3.15.pom; 包含翻译后的API文档:...
Spring Boot提供了测试支持模块,包含`spring-boot-starter-test`,这个模块引入了许多用于测试的依赖,如JUnit、Mockito、Hamcrest、Spring Test等。这些工具帮助开发者编写高效的单元测试和集成测试。 2. **...
Spring Test是Spring框架的一部分,专为测试Spring应用而设计,它提供了丰富的功能,使得开发者能够更轻松、更高效地对Spring驱动的应用进行单元测试和集成测试。在本篇中,我们将深入探讨Spring Test的关键概念、...
### Spring in Action 第二版 —— 详尽解析与学习指南 #### 一、书籍概述 《Spring in Action》第二版是一本深受开发者喜爱的技术书籍,由Craig Walls和Ryan Breidenbach共同撰写,并由Manning出版社出版。这本书...
赠送jar包:spring-boot-test-autoconfigure-2.5.5.jar; 赠送原API文档:spring-boot-test-autoconfigure-2.5.5-javadoc.jar; 赠送源代码:spring-boot-test-autoconfigure-2.5.5-sources.jar; 赠送Maven依赖信息...