applicationContext-core-test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<description>Spring公共配置文件</description>
<!-- 数据源配置,在测试环境使用单连接 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:springside-core-test" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<!-- Hibernate配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="org.springside.modules.unit.orm.hibernate.data" />
</bean>
<!-- 事务管理器配置,单数据源事务 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="springContextHolder" class="org.springside.modules.utils.spring.SpringContextHolder" lazy-init="false"/>
</beans>
SpringContextTestCase:
/**
* Copyright (c) 2005-2010 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* $Id: SpringContextTestCase.java 1210 2010-09-10 16:13:27Z calvinxiu $
*/
package org.springside.modules.test.spring;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
/**
* Spring的支持依赖注入的JUnit4 集成测试基类, 相比Spring原基类名字更短.
*
* 子类需要定义applicationContext文件的位置,如:
* @ContextConfiguration(locations = { "/applicationContext-test.xml" })
*
* @author calvin
*/
public abstract class SpringContextTestCase extends AbstractJUnit4SpringContextTests {
}
SpringTxTestCase:
/**
* Copyright (c) 2005-2010 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* $Id: SpringTxTestCase.java 1215 2010-09-12 04:14:26Z calvinxiu $
*/
package org.springside.modules.test.spring;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
/**
* Spring的支持数据库访问,事务控制和依赖注入的JUnit4 集成测试基类,相比Spring原基类名字更短.
*
* 子类需要定义applicationContext文件的位置, 如:
* @ContextConfiguration(locations = { "/applicationContext-test.xml" })
*
* @author calvin
*/
public abstract class SpringTxTestCase extends AbstractTransactionalJUnit4SpringContextTests {
protected DataSource dataSource;
@Override
@Autowired
public void setDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
this.dataSource = dataSource;
}
}
SimpleHibernateDaoTest:
package org.springside.modules.unit.orm.hibernate;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springside.modules.orm.hibernate.SimpleHibernateDao;
import org.springside.modules.test.spring.SpringTxTestCase;
import org.springside.modules.test.utils.DbUnitUtils;
import org.springside.modules.unit.orm.hibernate.data.User;
import org.springside.modules.utils.reflection.ReflectionUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@ContextConfiguration(locations = { "/applicationContext-core-test.xml" })
public class SimpleHibernateDaoTest extends SpringTxTestCase {
private static final String DEFAULT_LOGIN_NAME = "admin";
private SimpleHibernateDao<User, Long> dao;
@Autowired
private SessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
simpleJdbcTemplate.update("drop all objects");
executeSqlScript("classpath:/schema.sql", false);
DbUnitUtils.loadData((DataSource) applicationContext.getBean("dataSource"), "classpath:/test-data.xml");
dao = new SimpleHibernateDao<User, Long>(sessionFactory, User.class);
}
@Test
public void crud() {
User user = new User();
user.setName("foo");
user.setLoginName("foo");
//add
dao.save(user);
dao.flush();
//update
user.setName("boo");
dao.save(user);
dao.flush();
//delete object
dao.delete(user);
dao.flush();
//delete by id
User user2 = new User();
user2.setName("foo2");
user2.setLoginName("foo2");
dao.save(user2);
dao.flush();
dao.delete(user2.getId());
dao.flush();
}
@Test
public void getSome() {
//get all
List<User> users = dao.getAll();
assertEquals(6, users.size());
//get all with order
users = dao.getAll("id", true);
assertEquals(6, users.size());
assertEquals(DEFAULT_LOGIN_NAME, users.get(0).getLoginName());
//get by id list
users = dao.get(Lists.newArrayList(1L, 2L));
assertEquals(2, users.size());
}
@Test
public void findByProperty() {
List<User> users = dao.findBy("loginName", DEFAULT_LOGIN_NAME);
assertEquals(1, users.size());
assertEquals(DEFAULT_LOGIN_NAME, users.get(0).getLoginName());
User user = dao.findUniqueBy("loginName", DEFAULT_LOGIN_NAME);
assertEquals(DEFAULT_LOGIN_NAME, user.getLoginName());
}
@Test
public void findByHQL() {
List<User> users = dao.find("from User u where loginName=?", DEFAULT_LOGIN_NAME);
assertEquals(1, users.size());
assertEquals(DEFAULT_LOGIN_NAME, users.get(0).getLoginName());
User user = dao.findUnique("from User u where loginName=?", DEFAULT_LOGIN_NAME);
assertEquals(DEFAULT_LOGIN_NAME, user.getLoginName());
Map<String, Object> values = Maps.newHashMap();
values.put("loginName", DEFAULT_LOGIN_NAME);
users = dao.find("from User u where loginName=:loginName", values);
assertEquals(1, users.size());
assertEquals(DEFAULT_LOGIN_NAME, users.get(0).getLoginName());
user = dao.findUnique("from User u where loginName=:loginName", values);
assertEquals(DEFAULT_LOGIN_NAME, user.getLoginName());
}
@Test
public void findByCriterion() {
Criterion c = Restrictions.eq("loginName", DEFAULT_LOGIN_NAME);
List<User> users = dao.find(c);
assertEquals(1, users.size());
assertEquals(DEFAULT_LOGIN_NAME, users.get(0).getLoginName());
User user = dao.findUnique(c);
assertEquals(DEFAULT_LOGIN_NAME, user.getLoginName());
}
@Test
public void batchUpdate() {
Map map = new HashMap();
map.put("ids", new Long[] { 1L, 23L });
dao.batchExecute("update User u set u.status='disabled' where id in(:ids)", map);
User u1 = dao.get(1L);
assertEquals("disabled", u1.getStatus());
User u3 = dao.get(3L);
assertEquals("enabled", u3.getStatus());
}
@Test
public void eagerFetch() {
String sql = "from User u left join fetch u.roleList order by u.id";
Query query = dao.createQuery(sql);
List<User> userList = dao.distinct(query).list();
assertEquals(6, userList.size());
assertTrue(Hibernate.isInitialized(userList.get(0).getRoleList()));
Criteria criteria = dao.createCriteria().setFetchMode("roles", FetchMode.JOIN);
userList = dao.distinct(criteria).list();
assertEquals(6, userList.size());
assertTrue(Hibernate.isInitialized(userList.get(0).getRoleList()));
}
@Test
public void misc() {
getIdName();
isPropertyUnique();
constructor();
}
public void getIdName() {
assertEquals("id", dao.getIdName());
}
public void isPropertyUnique() {
assertEquals(true, dao.isPropertyUnique("loginName", "admin", "admin"));
assertEquals(true, dao.isPropertyUnique("loginName", "user6", "admin"));
assertEquals(false, dao.isPropertyUnique("loginName", "user2", "admin"));
}
public void constructor() {
MyUserDao myDao = new MyUserDao();
Class entityClazz = (Class) ReflectionUtils.getFieldValue(myDao, "entityClass");
assertEquals(User.class, entityClazz);
}
static class MyUserDao extends SimpleHibernateDao<User, Long> {
}
}