一个单元测试的例子

为什么80%的码农都做不了架构师?>>>   hot3.png

代码中引入单元测试,理论上是正确的,但是还没有实践过。但是从产品的角度去考虑的话,单元测试的必要性是很高的,“重构”这个东西听了好多,但是在公司内部,敢做重构的人估计不多,我曾经做过小功能的重构,那也是在比较熟悉这个功能的基础上做得,但是对于不规范、逻辑混乱的代码,估计就没人敢动手了,所以对于重构,其实是需要手段保证的,单元测试不能完全保证代码的各个层面重构,但是一定程度上是可以起到作用的。

基于上面的考虑,我考虑对service层做单元测试,起码保证服务层是有重构的空间。

从零开始研究junit,看了些junit的资料,然后自己写了一个单元测试的例子,其中关键的问题是模拟应用服务器提供jndi类型的数据源服务,这块功能使用了spring-mock.jar提供的SimpleNamingContext类,看完之后,发现还是比较简单。不多说,直接上类了。

AppServiceImplTest:单元测试类

import org.junit.BeforeClass;
import util.DataSourceUtil;

public class AppServiceImplTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		DataSourceUtil.initSqlUtilDataSource(DataSourceUtil.DATA_SOURCE_PROVIDE_TYPE_JNDI);
	}
}

单元测试的类方法就没放出来了,上面的serUpBeforeClasss方法里面,提供了数据源的初始化,之后就可以写自己的测试方法了。

DataSourceUtil:数据源模拟工具

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;

/**
 * 数据源模拟工具
 * @author psy
 */
public final class DataSourceUtil {
	
	/**
	 * 数据源提供类型-JNDI
	 */
	public final static String DATA_SOURCE_PROVIDE_TYPE_JNDI = "JNDI";
	
	public static void emptyActivatedContextBuilder(){
		try {
			SimpleNamingContextBuilder.emptyActivatedContextBuilder();
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 初始化JNDI数据源
	 * @throws Exception
	 */
	public static void initDataSourceByJndi(String jndiName) throws Exception{
		ApplicationContext ctx = new ClassPathXmlApplicationContext("jndi-config.xml");
        DataSource ds = (DataSource) ctx.getBean("dataSource");
        Context context = new InitialContext();
        context.bind(jndiName,ds);
        context.bind("java:comp/env/"+jndiName,ds);
	}
	
	/**
	 * 按照数据源提供类型初始化SqlUtil数据源
	 */
	public static void initSqlUtilDataSource(String dataSourceType)throws Exception{
		if(StringUtils.equals(DATA_SOURCE_PROVIDE_TYPE_JNDI, dataSourceType)){
			emptyActivatedContextBuilder();
			
			initDataSourceByJndi("jdbc/test");
		}
	}
}

大概就是这么个鬼了,单元测试实际的应用研究还在以后的时间里。

转载于:https://my.oschina.net/psuyun/blog/488924

你可能感兴趣的:(一个单元测试的例子)