论坛首页 入门技术论坛

请教:初学EasyMock,测试SERVICE时,这种情况应该如何写呢?

浏览 1878 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-04-10  
看了两三天单元测试,自知理解有限,但想凡事总得自己实践下,以加深理解~

于是,把以前的项目改了下,开始我的第一个测试,不幸的是。。。偶失败了 

问题很菜,恳请师兄们帮俺看看,不必留情,谢谢咯~

我的目的是测试Service的内部逻辑,因此,把DAO MOCK。以下是代码:


SERVICE接口:
package com.vale.esales.service;

import com.vale.esales.dao.IPrivilegedDao;
import com.vale.esales.domain.TbSysRole;

public interface IPrivilegedService {

	boolean addNewRole(TbSysRole role, int[] functions);

	void setPrivilegedDao(IPrivilegedDao privilegedDao);

}


SERVICE实现:
package com.vale.esales.service.impl;

import com.vale.esales.constants.PrivilegedProperties;
import com.vale.esales.dao.IPrivilegedDao;
import com.vale.esales.domain.TbSysFunctionItem;
import com.vale.esales.domain.TbSysRole;
import com.vale.esales.domain.TbSysRoleFunctionRelation;
import com.vale.esales.exception.RoleSettingException;
import com.vale.esales.service.IPrivilegedService;

public class PrivilegedService implements IPrivilegedService {

	private IPrivilegedDao privilegedDao;

	public void setPrivilegedDao(IPrivilegedDao privilegedDao) {
		// TODO Auto-generated method stub
		this.privilegedDao = privilegedDao;
	}

	public boolean addNewRole(TbSysRole role, int[] functions) {
		// TODO Auto-generated method stub
		role.setStatus(PrivilegedProperties.ROLE_AVALIABLE);
		boolean result = false;
		if (functions != null) {
			for (int itemId : functions) {
                // 这里测试是没有问题的
				TbSysFunctionItem funItem = privilegedDao
						.londFunctionItem(itemId);
				if (funItem.getUserModelId().intValue() != role
						.getUserModelId().intValue()) {
					throw new RoleSettingException(
							"角色创建失败! Cause: 角色与其所包含的功能必须同属于一个用户模块!");
				}
				TbSysRoleFunctionRelation relation = new TbSysRoleFunctionRelation();
				relation.setTbSysFunctionItem(funItem);
				relation.setTbSysRole(role);
				// 就是这里不知道在TEST里该怎么写
                privilegedDao.saveNewRole(relation);
				if (!result)
					result = true;
			}
		}

		return (result);
	}

}


DAO接口:
package com.vale.esales.dao;

import com.vale.esales.domain.TbSysFunctionItem;
import com.vale.esales.domain.TbSysRoleFunctionRelation;

public interface IPrivilegedDao {

	/**
	 * 根据功能ID加载Function实体, 通常用作关联使用.
	 * 
	 * @param itemId
	 *            功能ID
	 * @return
	 */
	public TbSysFunctionItem londFunctionItem(int itemId);
	
	/**
	 * 保存一个新的角色.
	 * 
	 * @param role
	 *            由中间关联对象保存
	 */
	public void saveNewRole(TbSysRoleFunctionRelation obj);
	
}


DAO实现:
package com.vale.esales.dao.impl;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.vale.esales.dao.IPrivilegedDao;
import com.vale.esales.domain.TbSysFunctionItem;
import com.vale.esales.domain.TbSysRoleFunctionRelation;

public class PrivilegedDao extends HibernateDaoSupport implements
		IPrivilegedDao {

	public TbSysFunctionItem londFunctionItem(int itemId) {
		// TODO Auto-generated method stub
		return ((TbSysFunctionItem) getSessionFactory().getCurrentSession()
				.load(TbSysFunctionItem.class, itemId));
	}

	public void saveNewRole(TbSysRoleFunctionRelation obj) {
		// TODO Auto-generated method stub
		getSessionFactory().getCurrentSession().save(obj);
	}

}


TEST:
package com.vale.esales.testcase.service;

import static org.easymock.EasyMock.*;

import com.vale.esales.constants.UserProperties;
import com.vale.esales.dao.IPrivilegedDao;
import com.vale.esales.domain.TbSysFunctionItem;
import com.vale.esales.domain.TbSysRole;
import com.vale.esales.domain.TbSysRoleFunctionRelation;
import com.vale.esales.service.IPrivilegedService;
import com.vale.esales.service.impl.PrivilegedService;

import junit.framework.TestCase;

public class TestPrivilegedService extends TestCase {

	private IPrivilegedDao privilegedDao;

	private IPrivilegedService privilegedService;

	protected void setUp() {
		privilegedDao = createMock(IPrivilegedDao.class);
		privilegedService = new PrivilegedService();
		privilegedService.setPrivilegedDao(privilegedDao);
	}

	protected void tearDown() {
		verify(privilegedDao);
	}

	public void testAddNewRoleOk() throws Exception {
		TbSysRole role = new TbSysRole();
		role.setName("总公司角色1");
		role.setDescription("TestCase创建!");
		role.setUserModelId(UserProperties.TYPE_COMPANY);
		int[] functions = { 6101, 6601, 6104, 6112 };

		for (int i : functions) {
        // 因为在SERVICE里,只需要用到FunctionItem的UserModel属性,没必要模拟所有的数据,所以这里调用构造器,只设置UserModel
			expect(privilegedDao.londFunctionItem(i)).andReturn(
					new TbSysFunctionItem(null, UserProperties.TYPE_COMPANY));
			TbSysRoleFunctionRelation role_function = new TbSysRoleFunctionRelation();
			role_function.setTbSysRole(role);
			role_function.setTbSysFunctionItem(new TbSysFunctionItem(null,
					UserProperties.TYPE_COMPANY));
            // 就是这里测试保存时不成功,如果把以下两行代码屏蔽,同时,把Service里的privilegedDao.saveNewRole(relation)也屏蔽掉,那么,测试通过。
			privilegedDao.saveNewRole(role_function);
			expectLastCall();
		}	
		
		replay(privilegedDao);

		assertTrue(privilegedService.addNewRole(role, functions));
	}

}

   发表时间:2008-04-10  
貌似是引用不一样,所以出错,这种在SERVICE里创建新对象的逻辑,该如何测呢?郁闷
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics