`
hz_chenwenbiao
  • 浏览: 1007989 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring 注解学习手札(六) 测试

阅读更多

既然系统基于注解自成一体,那么基于Spring的测试是否可以依赖注解轻松完成呢?坚决地没问题!
Spring-Test义不容辞的完成了这个任务!并且,通过Spring-Test的事务会滚控制,我们可以在不污染数据库数据的前提下进行业务测试!
完成这项内容,本次Spring 注解学习手札整理就正式落幕了! 感谢大家的关注!

相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试

这里将用到以下几个包:

引用

aopalliance-1.0.jar
commons-collections.jar
commons-dbcp.jar
commons-logging-1.1.1.jar
commons-pool.jar
junit-4.4.jar
jstl.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.6-bin.jar
spring-aop-2.5.6.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-tx-2.5.6.jar
spring-test-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard.jar


主要增加了spring-test-2.5.6.jar和junit-4.4.jar两个用于测试的包!
这里尤其要说明一下,由于我们使用注解方式自然要用到JUnit-4.X系列,而Sring-Test对于JUnit有个累人的要求,JUnit的版本必须是4.4,不支持高版本(如4.5、4.7等)。否则,会产生java.lang.ClassNotFoundException: org.junit.Assume$AssumptionViolatedException异常。
先来一个能够自动回滚的用于测试的父类——AbstractTestCase
AbstractTestCase.java

Java代码 复制代码
  1. /**  
  2.  * 2009-12-16  
  3.  */  
  4. package org.zlex.spring;   
  5.   
  6. import org.junit.runner.RunWith;   
  7. import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;   
  8. import org.springframework.test.context.ContextConfiguration;   
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;   
  10. import org.springframework.test.context.transaction.TransactionConfiguration;   
  11. import org.springframework.transaction.annotation.Transactional;   
  12.   
  13. /**  
  14.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  15.  * @version 1.0  
  16.  * @since 1.0  
  17.  */  
  18. @ContextConfiguration(locations = "classpath:applicationContext.xml")   
  19. @RunWith(SpringJUnit4ClassRunner.class)   
  20. @Transactional  
  21. @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)   
  22. public abstract class AbstractTestCase extends  
  23.         AbstractTransactionalDataSourceSpringContextTests {   
  24.   
  25. }  
/**
 * 2009-12-16
 */
package org.zlex.spring;

import org.junit.runner.RunWith;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @version 1.0
 * @since 1.0
 */
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public abstract class AbstractTestCase extends
		AbstractTransactionalDataSourceSpringContextTests {

}


让每一个测试类都写一堆配置忒麻烦! 索性来个老爹替子子孙孙都完成基础工作!
逐行分析:
@ContextConfiguration(locations = "classpath:applicationContext.xml")导入配置文件。这时候,我们可以看出之前使用applicationContext.xml文件作为系统总控文件的好处! 当然,Spring-Test的这个配置只认classpath,很无奈,我必须拷贝这些文件到根目录!
@RunWith(SpringJUnit4ClassRunner.class)SpringJUnit支持,由此引入Spring-Test框架支持!
@Transactional这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
AbstractTransactionalDataSourceSpringContextTests要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类!
给出一个整体结构图:

test子目录下的文件将编译到classpath下,这其实还同时是个maven测试项目!拷一堆配置文件的确有些不方便!
AbstractTestCase.java用于抽象测试类控制。
AccountDaoTest.java用于AccountDao测试。
DaoAllTests.java用于Dao层的整体测试。
来看看AccountDaoTest
AccountDaoTest.java

Java代码 复制代码
  1. /**  
  2.  * 2009-12-16  
  3.  */  
  4. package org.zlex.spring;   
  5.   
  6. import java.util.Date;   
  7.   
  8. import org.junit.Test;   
  9. import org.springframework.beans.factory.annotation.Autowired;   
  10. import org.zlex.spring.dao.AccountDao;   
  11. import org.zlex.spring.domain.Account;   
  12.   
  13. /**  
  14.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  15.  * @version 1.0  
  16.  * @since 1.0  
  17.  */  
  18. public class AccountDaoTest extends AbstractTestCase {   
  19.   
  20.     @Autowired  
  21.     private AccountDao accountDao;   
  22.   
  23.     @Test  
  24.     public void test() {   
  25.         Account ac = new Account();   
  26.         ac.setBirthday(new Date());   
  27.         ac.setUsername("SPRING");   
  28.         ac.setPassword("SNOWOLF");   
  29.         ac.setEmail("spring@zlex.org");   
  30.   
  31.         // 创建用户   
  32.         accountDao.create(ac);   
  33.   
  34.         // 检索   
  35.         Account account = accountDao.read("SPRING");   
  36.   
  37.         // 校验   
  38.         assertNotNull(account);   
  39.     }   
  40.   
  41. }  
/**
 * 2009-12-16
 */
package org.zlex.spring;

import java.util.Date;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.zlex.spring.dao.AccountDao;
import org.zlex.spring.domain.Account;

/**
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @version 1.0
 * @since 1.0
 */
public class AccountDaoTest extends AbstractTestCase {

	@Autowired
	private AccountDao accountDao;

	@Test
	public void test() {
		Account ac = new Account();
		ac.setBirthday(new Date());
		ac.setUsername("SPRING");
		ac.setPassword("SNOWOLF");
		ac.setEmail("spring@zlex.org");

		// 创建用户
		accountDao.create(ac);

		// 检索
		Account account = accountDao.read("SPRING");

		// 校验
		assertNotNull(account);
	}

}


只要记得使用注解@Test标识方法即可!
这里插入了一条数据,之后进行检索。如果数据存在则认为测试成功! 当然,这时候你要看看数据库是不是真的插入了一条数据!
执行这个方法,同时监控数据库,观察日志!最有效的办法是在执行检索方法时加入断点,同时监控数据库记录,你会发现此时数据库无此数据录入! 实际上这是一个未提交的事务!
完成操作,看看这时的日志:

数据库其实已经进行了回滚!
再看看DaoAllTests
DaoAllTests.java

Java代码 复制代码
  1. /**  
  2.  * 2009-12-17  
  3.  */  
  4. package org.zlex.spring;   
  5.   
  6. import org.junit.runner.RunWith;   
  7. import org.junit.runners.Suite;   
  8. import org.junit.runners.Suite.SuiteClasses;   
  9.   
  10. /**  
  11.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  12.  * @version 1.0  
  13.  * @since 1.0  
  14.  */  
  15. @RunWith(Suite.class)   
  16. @SuiteClasses( { AccountDaoTest.class, AccountDaoTest.class })   
  17. public class DaoAllTests {   
  18.   
  19. }  
/**
 * 2009-12-17
 */
package org.zlex.spring;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

/**
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @version 1.0
 * @since 1.0
 */
@RunWith(Suite.class)
@SuiteClasses( { AccountDaoTest.class, AccountDaoTest.class })
public class DaoAllTests {

}


逐行说明:
@RunWith(Suite.class)集合测试
@SuiteClasses( { AccountDaoTest.class })集合,包括AccountDaoTest类,多个测试类可使用逗号分隔!
这个测试类可用于Dao层集合测试,与Spring无关!

分享到:
评论

相关推荐

    Spring 注解学习手札(一) 构建简单Web应用

    在本篇《Spring注解学习手札(一)构建简单Web应用》中,我们将深入探讨如何使用Spring框架的注解来构建一个基本的Web应用程序。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛应用。它简化了依赖注入、...

    Spring 注解学习手札

    【Spring注解学习手札】 在现代Java Web开发中,Spring框架因其强大的功能和灵活性而备受推崇。Spring注解的引入极大地简化了配置文件,提高了开发效率。本篇将聚焦于Spring MVC中的注解,通过构建一个简单的Web...

    Spring 注解学习手札(四) 持久层浅析

    在本篇《Spring注解学习手札(四)持久层浅析》中,我们将深入探讨Spring框架在持久层的应用,特别是如何通过注解简化数据库操作。Spring作为一个强大的轻量级框架,提供了丰富的功能来处理数据访问,使得开发者可以...

    Spring 注解学习手札(二) 控制层梳理

    这篇“Spring注解学习手札(二)控制层梳理”主要聚焦于如何利用注解来构建和理解Spring MVC的控制层,即Controller。Spring MVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。 一、@RestController...

    Spring 注解学习手札(三) 表单页面处理

    在本篇《Spring注解学习手札(三)表单页面处理》中,我们将深入探讨Spring框架中关于处理Web表单的关键注解和技术。在实际的Web开发中,表单处理是用户交互的重要组成部分,Spring提供了强大的支持,使得开发者能够...

    Spring 注解学习手札(五) 业务层事务处理

    这篇“Spring注解学习手札(五)——业务层事务处理”深入探讨了如何使用注解来管理应用程序中的事务,确保数据的一致性和完整性。Spring提供了声明式事务管理,使得开发者无需编写繁琐的事务控制代码,只需在方法上...

    Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    在Spring框架中,注解是实现轻量级、声明式编程的重要工具,极大地简化了代码并提高了可维护性。本文将深入探讨`@ResponseBody`、`@RequestBody`和`@PathVariable`这三个关键注解,它们在处理HTTP请求和响应中的作用...

    spring 的详细使用

    - "spring-reference.pdf" 和 "Spring注解手札.pdf" 可能是详细的 Spring 参考文档和注解指南,对于深入学习 Spring 极为有用。 以上内容只是 Spring 框架的冰山一角,想要精通 Spring,还需要通过阅读文档、实践...

    详解Spring data 定义默认时间与日期的实例

    Spring Data提供了相关的注解来帮助我们实现这一需求。 ### 创建时间和更新时间的JPA注解 1. `@CreatedDate`:用于自动填充实体创建时的时间戳。使用此注解的字段将在实体创建时被自动填充当前时间。 2. `@Last...

    springboot+securitydemo

    通过这个示例项目,你可以学习到如何在Spring Boot中集成Spring Security,实现用户认证(Authentication)和授权(Authorization)。Spring Security提供了基于角色的访问控制(Role-Based Access Control, RBAC)...

Global site tag (gtag.js) - Google Analytics