Spring Test---DAO 篇
在用Spring框架开发过程中,会定义一些bean。有些bean之间有依赖关系。
单元测试(Unit Test)需要构造被测试的对象,有些可以通过简单的new运算符生成一个实例。对于比较复杂的对象,比如DAO,有一些依赖关系,构造起来比较麻烦。这时可以通过Spring Test Framework的annotation机制来处理这些复杂的对象。
假设文件路径如下:
<Project>/src/com/example/dao
<Project>/test/com/example/dao
package com.example.dao
@ContextConfiguration(
locations={"classpath:MyDAOTest-context.xml",
"classpath:other-context-config.xml"
}
)
public class MyDAOTest extends AbstractJUnit4SpringContextTests {
// @Resource(name="myDao")
@Autowired
private MyDAO myDao;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testSave() {
MyBean entity = new MyBean();
//set attributes
myDao.saveOrUpdate(entity);
Assert.isTrue(true);
}
} put MyDAOTest-context.xml, other-context-config.xml under folder <Project>/test
------------------------------MyDAOTest-context.xml-------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">-->
<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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="myDao" class="com.example.dao.MyDAOImpl">
<property name="sessionFactory" ref="amSessionFactory"/>
</bean>
<bean id="amSessionFactory" parent="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!-- <property name="packagesToScan"> -->
<!-- <list> -->
<!-- <value>com.example.model</value> -->
<!-- </list> -->
<!-- </property> -->
<property name="packagesToScan" value="com.example.model" />
</bean>
</beans> -------------------------------------------------other-context-config.xm-------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">-->
<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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="propertyPlaceholder"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.properties" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${oracle.jdbc.driver_class}"/>
<property name="url" value="${oracle.jdbc.url}"/>
<property name="username" value="${oracle.jdbc.username}"/>
<property name="password" value="${oracle.jdbc.password}"/>
</bean>
<bean id="entityInterceptor"
class="com.mercury.itg.core.persistency.HibernateITGInterceptor"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<ref bean="hibernateProperties"/>
</property>
<property name="entityInterceptor">
<ref local="entityInterceptor"/>
</property>
</bean>
<bean id="hibernateProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.c3p0.minPoolSize">5</prop>
<prop key="hibernate.c3p0.maxPoolSize">20</prop>
<prop key="hibernate.c3p0.timeout">600</prop>
<prop key="hibernate.c3p0.max_statement">50</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">
false
</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
</bean>
<tx:annotation-driven/>
</beans>--------------------------------------database.properties-------------------------------------------
oracle.jdbc.driver_class=oracle.jdbc.driver.OracleDriver oracle.jdbc.url=jdbc:oracle:thin:@localhost:1521:MySID oracle.jdbc.username=username oracle.jdbc.password=password oracle.jdbc.schema=MySchema oracle.jdbc.system.username=system oracle.jdbc.system.password=Admin2012 oracle.jdbc.sys.username=sys oracle.jdbc.sys.password=Admin2012
@ContextConfiguration 究竟做了什么呢?可以通过下面这段代码来解释。
public class MyDAOTest {
protected static ApplicationContext ac = null;
static{
ac = new ClassPathXmlApplicationContext(new String[]{"MyDAOTest-context.xml","other-context-config.xml"});
}
protected MyDAO myDao;
@Before
public void setUp() throws Exception {
myDao = (MappingDAO)ac.getBean("myDao");
}
@After
public void tearDown() throws Exception {
}
@Test
public void testSave() {
...
}