论坛首页 入门技术论坛

spring+hibernate单元测试 示例

浏览 5973 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-10  
spring单元测试,据传说很简单,但按照网上的方法总有问题。换了一种方法试成功了。

1.表:

sql 代码
  1. create table t_user (   
  2.    id                   varchar(20)          not null,   
  3.    name                 varchar(20)          null  
  4.    constraint PK_T_USER primary key (id)   
  5. )  
2。hibernate层: 自动生成的domain code
java 代码
  1. package com.forum.model;   
  2.   
  3. // Generated 2007-5-9 9:42:02 by Hibernate Tools 3.2.0.b9   
  4.   
  5. /**  
  6.  * TUser generated by hbm2java  
  7.  */  
  8. public class User implements java.io.Serializable {   
  9.   
  10.     private String id;   
  11.   
  12.     private String name;   
  13.   
  14.        
  15.   
  16.     public User() {   
  17.     }   
  18.   
  19.     public User(String id) {   
  20.         this.id = id;   
  21.     }   
  22.   
  23.     public User(String id, String name) {   
  24.         this.id = id;   
  25.         this.name = name;          
  26.     }   
  27.   
  28.     public String getId() {   
  29.         return this.id;   
  30.     }   
  31.   
  32.     public void setId(String id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public String getName() {   
  37.         return this.name;   
  38.     }   
  39.   
  40.     public void setName(String name) {   
  41.         this.name = name;   
  42.     }      
  43.   
  44. }   

       hbm文件:

xml 代码
  1. <!---->  
  2. <!---->xml version="1.0"?>  
  3. <!---->
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <!---->  
  6. <hibernate-mapping>  
  7.     <class name="com.forum.model.User" table="t_user" schema="dbo" catalog="forum">  
  8.         <id name="id" type="string">  
  9.             <column name="id" length="20" />  
  10.             <generator class="assigned" />  
  11.         id>  
  12.         <property name="name" type="string">  
  13.             <column name="name" length="20" />  
  14.         property>           
  15.     class>  
  16. hibernate-mapping>  

 3.spring层(作为服务层)

java 代码
  1. package com.forum.service;   
  2.   
  3. import com.forum.model.User;   
  4.   
  5. import java.util.List;   
  6.   
  7. public class UserService extends BaseService {   
  8.        
  9.     private static final String SQL_SELECT_BYID = "from User as u where u.id=?";    
  10.   
  11.     public User findUserById(String userId) throws ServiceException {   
  12.         try {   
  13.             List list = hibernateTemplate.find(SQL_SELECT_BYID, userId);   
  14.             return list.isEmpty() ? null : (User) list.get(0);   
  15.         } catch (Exception e) {   
  16.             throw new ServiceException("Cannot find the User[" + userId + "]: " + e, e);   
  17.         }   
  18.     }     
  19. }   
java 代码
  1. package com.forum.service;   
  2. import org.springframework.orm.hibernate3.HibernateTemplate;   
  3. import java.util.List;   
  4.   
  5. public abstract class BaseService implements java.io.Serializable {   
  6.        
  7.     protected HibernateTemplate hibernateTemplate;      
  8.   
  9.     public HibernateTemplate getHibernateTemplate() {   
  10.         return hibernateTemplate;   
  11.     }   
  12.   
  13.     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {   
  14.         this.hibernateTemplate = hibernateTemplate;   
  15.     }       
  16. }  

测试类:
java 代码
  1. package com.forum.service;   
  2.   
  3. import com.forum.model.User;   
  4. import org.junit.Before;   
  5. import org.junit.Test;   
  6.   
  7. public class UserServiceTest extends BaseServiceTest {   
  8.     private User user;   
  9.     private UserService userService;   
  10.   
  11.     @Before  
  12.     protected void setUp() throws Exception {   
  13.         userService = (UserService) ctx.getBean("userService");   
  14.     }   
  15.   
  16.     @Test  
  17.     public void testFindUserById() throws Exception {   
  18.         user = userService.findUserById("1");   
  19.         assertNotNull(user);   
  20.     }   
  21. }   

4.applicationContext_test.xml 放在class下或者src目录下。
java 代码
  1. <!---->"1.0" encoding="UTF-8"?>   
  2. <!---->"-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
  3. default-autowire="byName">   
  4.        
  5.   
  6.     "dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  7.         "driverClassName"><value></value>net.sourceforge.jtds.jdbc.Driver   
  8.         "url"><value></value>jdbc:jtds:sqlserver://127.0.0.1:1433/forum   
  9.         "username"><value></value>sa   
  10.         "password"><value></value>sa   
  11.        
  12.   
  13.     <!---->   
  14.     "sessionFactory"  
  15.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  16.         "configLocation">   
  17.             <value></value>classpath:hibernate.cfg.xml   
  18.            
  19.         "dataSource">   
  20.             "dataSource"/>   
  21.            
  22.        
  23.   
  24.     "hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">   
  25.         "sessionFactory">   
  26.             "sessionFactory"/>   
  27.            
  28.        
  29.   
  30.     "userService" class="com.forum.service.UserService">   
  31.     "hibernateTemplate" ref="hibernateTemplate"/>   
  32.         
  33.   
  34.   


    hibenate.cfg.xml 的内容自己完成。工具自动生成的时候就有的。

5. 运行就可以了。

6。注意问题: spring 测试时要导入相应的jar文件(它的lib下有)

   发表时间:2007-05-10  
对于service的测试算是实现了,可是测试的数据却依赖于数据库,比如userid为1的不存在就会导致断言的错误;而且测试方法可能会破坏数据库中的数据(可能删除或者更改掉),除非开发跟测试是两个不同数据库。
0 请登录后投票
   发表时间:2007-05-11  
做这个测试的初衷就是要集成hibernate,当然要涉及到底层的数据库,而且有一些样本数据。userid为1基本上会存在。要是要确保正确,可是试试打印出来user的信心就可以了。
0 请登录后投票
   发表时间:2007-05-11  
spring + hibernate 要这么用...无语
别用spring得了.
0 请登录后投票
   发表时间:2007-05-11  
Godlikeme   能不能讲的细一点。
0 请登录后投票
   发表时间:2007-05-11  
spring 自带了事务处理控制,怎么不用~~
还有单元测试可以用spring自带的mock测试啊
0 请登录后投票
   发表时间:2007-05-11  
BaseService里面简单的封装了sessionFactory, session的处理,
封装的还有很多问题。
为什么不用hiberanteTemplate呢。
0 请登录后投票
   发表时间:2007-05-13  
多谢Godlikeme,我把代码改了下。顺便问下测试的配置文件applicationContext-test.xml这么放总感觉不是办法,但是我的applicationContext.xml中的dataSource是通过加载配置文件来获取的。再junit run的时候会出问题。我的dataSouce是这样写的
<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>/WEB-INF/jdbc.properties</value>
			</list>
		</property>
	</bean>
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName"
			value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
0 请登录后投票
   发表时间:2007-05-13  
Godlikeme 写道
spring + hibernate 要这么用...无语
别用spring得了.


拿该如何用spring啊??
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics