junit在spring中进行单元测试
在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"ref="unitTestDB" /></bean><!--基于@Transactional注解方式的事务管理 --> <tx:annotation-driven transaction-manager="transactionManager"/>
?注意,applicationContext.xml中配置的事务的名字为transactionManager,如果自定义名字,则在基类中必须重新定义和引用该事务,例如 ,在配置文件中配置的事务如下,
?
<!-- 注册一个JDBC数据源事务管理器 --><bean id="transactionManager"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: Jasson.Gao@morningstar.com (Jasson Gao) * @CreateTime: Nov 17, 2011 3:15:51 PM * @ModifiedBy: -- * @ModifyTime:-- * @ModifyDescription:-- * @Version: 4.0 */public class DBConnectPoolTestClazzTest extends AbstractTestCase{@Resourceprivate IDBConnectPoolTestClazz dBConnectPoolTestClazz;/** * Test method for * {@link com.morningstar.planning.dao.impl.DBConnectPoolTestClazzImpl#isExist()}. */@Testpublic 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: */@Beforepublic void setUp() throws Exception {initSpringFramework();}/** * @throws java.lang.Exception * @Description: */@Afterpublic void tearDown() throws Exception {}@Testpublic void testAdd() {User user = new User();user.setUserName("user" + UUID.randomUUID());user.setPassword("jasson");user.setEmail("Jasson.gao@morningstar.com");iUserDao.add(user);}}?
?
?