使用spring-mock进行dao单元测试
来源:互联网 发布:霍尼韦尔网络报警模块 编辑:程序博客网 时间:2024/04/29 08:19
使用spring-mock进行dao集成测试
一地鸡毛 @ 2005-03-25 16:19
在进行dao的集成测试时候,数据清理,察看数据都是比较麻烦的事情,使用Spring-mock.jar可以帮助我们简化着一个过程。
我举一个简单的例子,说明一下如何使用spring-mock。
首先是po, hbm.xml, dao, daoimpl没什么好说的:
首先是po, hbm.xml, dao, daoimpl没什么好说的:
Customer.java :
package rst.spring.mock;
import java.io.Serializable;
/** @author Hibernate CodeGenerator */
public class Customer implements Serializable {
/** identifier field */
private Long id;
/** nullable persistent field */
private String name;
/** full constructor */
public Customer(String name) {
this.name = name;
}
/** default constructor */
public Customer() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Customer.hbm.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="rst.spring.mock">
<class name="Customer" table="customer">
<id name="id" column="id" type="long" unsaved-value="null">
<generator class="identity"/>
</id>
<property name="name" column="name" type="string"/>
</class>
</hibernate-mapping>
CustomerDAO :
/*
* Created on 2005-3-25
*/
package rst.spring.mock;
import org.springframework.dao.DataAccessException;
/**
* @author rst
*
*/
public interface CustomerDAO {
public void add(Customer customer) throws DataAccessException;
}
CustomerDAOImpl :
package rst.spring.mock;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
/**
* Class description.
*
* @author rst
*/
public class CustomerDAOHibernateImpl extends HibernateDaoSupport implements CustomerDAO{
public void add(Customer customer) throws DataAccessException{
this.getHibernateTemplate().save(customer);
}
}
然后测试的基类SpringDAOTestCase继承自AbstractTransactionalDataSourceSpringContextTests,目前只有一个指定测试用xml文件位置的逻辑。
package rst.spring.mock;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
/**
* Class description.
*
* @author rst
*/
public abstract class SpringDAOTestCase extends AbstractTransactionalDataSourceSpringContextTests {
protected String[] getConfigLocations() {
return new String[] { "test.xml" };
}
}
接着是我们真正测试的类CustomerDAOTest.java:
package rst.spring.mock;
/**
* Class description.
*
* @author rst
*/
public class CustomerDaoTest extends SpringDAOTestCase {
private CustomerDAOHibernateImpl customerDAO;
protected void onSetUpInTransaction() throws Exception {
super.onSetUpInTransaction();
//this.setPopulateProtectedVariables(true);
customerDAO = (CustomerDAOHibernateImpl) this.applicationContext.getBean("customerDAO");
}
protected void onTearDownInTransaction() {
customerDAO = null;
}
public void testInsert() {
Customer customer = new Customer();
customer.setName("javaeye");
customerDAO.add(customer);
String name = (String) jdbcTemplate.queryForObject("select name from customer where id=?", new Object[]{customer.getId()}, String.class);
assertEquals(customer.getName(), name);
}
}
最后看看配置文件test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--
- Application context definition for Petclinic on Hibernate.
-->
<beans>
<!-- ========================= RESOURCE DEFINITIONS ========================= -->
<!-- Configurer that replaces ${...} placeholders with values from a properties file -->
<!-- (in this case, JDBC-related settings for the dataSource definition below) -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location"><value>classpath:jdbc.properties</value></property>
</bean>
<!-- Local DataSource that works in any environment -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<value>rst/spring/mock/Customer.hbm.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="customerDAO" class="rst.spring.mock.CustomerDAOHibernateImpl">
<property name="hibernateTemplate"><ref local="hibernateTemplate"/></property>
</bean>
</beans>
这个文件很简单,不要忘记transactionManager的配置,Test类会自动装配的。
运行之后,就可以看到应有的结果,并且数据库中不会有数据污染。这个过程主要是开始一个transaction,然后开始你的test方法,执行dao操作,
执行sql查询验证结果,最后无论成功失败rollback transaction。
- 使用spring-mock进行dao单元测试
- 使用spring-mock进行dao集成测试
- 使用mock进行单元测试
- 今天使用了spring-mock来进行单元测试
- 使用Mock 对spring mvc 的controller层进行单元测试
- 使用MOCK对象进行单元测试
- 使用 MOCK 对象进行单元测试
- 使用MOCK对象进行单元测试
- 使用mock进行java单元测试
- 利用Spring的mock进行单元测试
- 利用spring的mock类进行单元测试
- 利用spring的mock类进行单元测试
- 利用spring的mock类进行单元测试
- spring-boot整合Mock进行单元测试
- 使用 Python Mock 类进行单元测试
- 使用 Python Mock 类进行单元测试
- Spring学习12-Spring利用mock进行单元测试
- spring-mock单元测试新方法
- 关于Jmail
- IIS6环境下安装PHP5手记
- Windows内存管理学习之一
- 动态加载dll的导出函数的问题
- 怎样判断一个SqlTransaction能否被rollback和commit?
- 使用spring-mock进行dao单元测试
- javascript--一种奇怪的语言
- 数据库设计三大范式应用实例剖析
- 日期控件,javascript
- 为什么我不能提前离开
- 关于ASP.NET的三层结构
- 精彩blog收集
- shell 的判断中的空格
- 开发利器之单元测试