在实际开发中,底层代码开发完成需要对其每个方法进行单元测试,以验证是否达到预期效果。 import java.sql.Connection; import javax.annotation.Resource; import javax.sql.DataSource; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import emoe.addresslist.AddressListManager; /* * @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)。这样做操作的数据才不会污染数据库! */ @ContextConfiguration(locations = { "classpath:emoe/addresslist/test/applicationContext.xml" }) @RunWith(SpringJUnit4ClassRunner.class) public class BaseSpringTest { protected Connection connection; protected boolean hasError = false; @Resource private DataSource dataSource; @Before public void before() throws Exception { connection = dataSource.getConnection(); connection.setAutoCommit(false); } @After public void after() throws Exception { if (connection != null) { if (hasError) { connection.rollback(); } else { connection.commit(); } connection.close(); } } public Connection getConnection() { return connection; } public void setConnection(Connection connection) { this.connection = connection; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } } 以后的单元测试类只需要要继承BaseSpringTest就ok了 applicationContext.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-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"> <context:property-placeholder location="classpath:emoe/addresslist/test/jdbc.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <!-- iBATIS sqlMapClient config --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"> <value>sqlConfig.xml</value> </property> <property name="dataSource" ref="dataSource"/> </bean> </beans>