在spring中,已实现了junit和spring的集成单元测试,在这方面不得不佩服spring,的确是个了不起的框架,要在spring框架中实现单元测试,首先应建立一个base的测试类,如下:
import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) /* * if change the name of transactionManager,it need add code as bellow: for * example you define the transactionManager's name is txManager,you must add * the following code * * @Transactional * * @TransactionConfiguration(transactionManager = "txManager", defaultRollback * =true) */ public abstract class AbstractTestCase extends AbstractTransactionalJUnit4SpringContextTests { }
在该基类中,定义了加载spring config的文件,
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
同时,注意要在spring的applicationContext.xml配置事务管理如下:
<!-- 注册一个JDBC数据源事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="unitTestDB" /> </bean> <!--基于@Transactional注解方式的事务管理 --> <tx:annotation-driven transaction-manager="transactionManager"/>
注意,applicationContext.xml中配置的事务的名字为transactionManager,如果自定义名字,则在基类中必须重新定义和引用该事务,例如 ,在配置文件中配置的事务如下,
<!-- 注册一个JDBC数据源事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="unitTestDB" /> </bean> <!--基于@Transactional注解方式的事务管理 --> <tx:annotation-driven transaction-manager="txManager"/>
则在基类中需要如下的配置
@Transactional @TransactionConfiguration(transactionManager = "txManager", defaultRollback =true) public abstract class AbstractTestCase extends AbstractTransactionalJUnit4SpringContextTests { }
2、其他测试类继承该基类,如下
/** * @ProjectName: UnitTestDemo * @ClassName: MyTestImplTest * @Description: -- * @Author: [email protected] (Jasson Gao) * @CreateTime: Nov 17, 2011 3:15:51 PM * @ModifiedBy: -- * @ModifyTime:-- * @ModifyDescription:-- * @Version: 4.0 */ public class DBConnectPoolTestClazzTest extends AbstractTestCase{ @Resource private IDBConnectPoolTestClazz dBConnectPoolTestClazz; /** * Test method for * {@link com.morningstar.planning.dao.impl.DBConnectPoolTestClazzImpl#isExist()}. */ @Test public void testIsExist() { Assert.assertTrue(dBConnectPoolTestClazz.isExist()); } }
点击右键,进行unit的运行即可
在spring中,配置事务的好处是每次运行测试完毕后,整个对数据库的操作进行了回滚,防止了向数据库中插入不必要数据的可能,同时又保证单元测试的正确性。
下面是传统的单元测试方法,对比下,相信spring框架单元测试的方便性
public class RecordTest { private IUserDao iUserDao; private void initSpringFramework() { ApplicationContext cx = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); iUserDao = (IUserDao) cx.getBean("userDao"); } /** * @throws java.lang.Exception * @Description: */ @Before public void setUp() throws Exception { initSpringFramework(); } /** * @throws java.lang.Exception * @Description: */ @After public void tearDown() throws Exception { } @Test public void testAdd() { User user = new User(); user.setUserName("user" + UUID.randomUUID()); user.setPassword("jasson"); user.setEmail("[email protected]"); iUserDao.add(user); } }