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"
		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);
	}
}

猜你喜欢

转载自gaojiewyh.iteye.com/blog/1270944