package com.jinhe.tss.cms; import java.io.File; import java.util.List; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests; import org.springframework.test.context.transaction.TransactionConfiguration; import com.jinhe.tss.cms.dao.IArticleDao; import com.jinhe.tss.cms.dao.IChannelDao; import com.jinhe.tss.cms.entity.ArticleType; import com.jinhe.tss.cms.service.IArticleService; import com.jinhe.tss.cms.service.IArticleTypeService; import com.jinhe.tss.cms.service.IChannelService; import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService; import com.jinhe.tss.component.log.maintain.LogService; import com.jinhe.tss.component.support.test.IH2DBServer; import com.jinhe.tss.component.support.test.TestUtil; import com.jinhe.tss.core.Global; import com.jinhe.tss.core.sso.IdentityCard; import com.jinhe.tss.core.sso.TokenUtil; import com.jinhe.tss.core.sso.context.Context; import com.jinhe.tss.core.util.FileHelper; import com.jinhe.tss.core.util.URLUtil; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.um.UMConstants; import com.jinhe.tss.um.helper.dto.OperatorDTO; import com.jinhe.tss.um.permission.PermissionHelper; import com.jinhe.tss.um.permission.PermissionService; import com.jinhe.tss.um.service.ILoginService; import com.jinhe.tss.um.service.IResourceRegisterService; /** * Junit Test 类里执行构造函数的时候无事务,即构造函数不在单元测试方法的事物边界内。 */ @ContextConfiguration( locations={ "classpath:spring/testCMSApplicationContext.xml", "classpath:spring/component-applicationContext.xml", "classpath:spring/core-applicationContext.xml", "classpath:spring/um-applicationContext.xml", "classpath:spring/cms-applicationContext.xml", "classpath:spring/cms-upload-applicationContext.xml" } , inheritLocations = false // 是否要继承父测试用例类中的 Spring 配置文件,默认为 true ) @TransactionConfiguration(defaultRollback = false) // 不自动回滚,否则后续的test中没有初始化的数据 public abstract class TxSupportTest4CMS extends AbstractTransactionalJUnit38SpringContextTests { protected Logger log = Logger.getLogger(this.getClass()); @Autowired protected IResourceRegisterService resourceRegisterService; @Autowired protected IRemotePropertyService propertyService; @Autowired protected ILoginService loginSerivce; @Autowired protected PermissionService permissionService; @Autowired protected PermissionHelper permissionHelper; @Autowired protected LogService logService; @Autowired protected IH2DBServer dbserver; @Autowired protected IArticleTypeService articleTypeService; @Autowired protected IChannelService channelService; @Autowired protected IArticleService articleService; @Autowired protected IChannelDao channelDao; @Autowired protected IArticleDao articleDao; protected void setUp() throws Exception { super.setUp(); Global.setContext(super.applicationContext); Context.setResponse(new MockHttpServletResponse()); // DB数据在一轮跑多个单元测试中初始化一次就够了。 if( dbserver.isPrepareed() ) { return; } init(); dbserver.setPrepareed(true); } /** * 初始化CMS的动态属性相关模板 */ protected void init() { // 初始化数据库脚本 String sqlpath = TestUtil.getInitSQLDir(); log.info( " sql path : " + sqlpath); TestUtil.excuteSQL(sqlpath + "/component"); TestUtil.excuteSQL(sqlpath + "/um"); TestUtil.excuteSQL(sqlpath + "/cms"); // 初始化虚拟登录用户信息 login(UMConstants.ADMIN_USER_ID, UMConstants.ADMIN_USER_NAME); /* 初始化应用系统、资源、权限项 */ Document doc = XMLDocUtil.createDocByAbsolutePath(sqlpath + "/cms-application-config.xml"); resourceRegisterService.setInitial(true); resourceRegisterService.applicationRegisterByXML(doc, UMConstants.PLATFORM_SYSTEM_APP); resourceRegisterService.setInitial(false); /** 注册动态属性实体(包括站点栏目、文章等) */ File path = new File(URLUtil.getResourceFileUrl(TestUtil.DYN_ENTITY_CONFIG_PATH).getFile()); List<String> files = FileHelper.listFilesByType(".xml", path); for( String fileName : files ){ if (!"ArticleProperties.xml".equals(fileName)) { Document tempDoc = XMLDocUtil.createDoc(TestUtil.DYN_ENTITY_CONFIG_PATH + "/" + fileName); propertyService.importDynableEntity(tempDoc.asXML()); } } /** 初始化一个普通文章类型 */ initCommonArticleType(); } protected static ArticleType defaultArticleType; /** 初始化一个普通文章类型 */ private void initCommonArticleType() { ArticleType articleTypeGroup = new ArticleType(); articleTypeGroup.setName("基本类型组"); articleTypeGroup.setParentId(CMSConstants.HEAD_NODE_ID); articleTypeGroup.setIsGroup(CMSConstants.TRUE); articleTypeGroup = articleTypeService.createArticleType(articleTypeGroup); defaultArticleType = new ArticleType(); defaultArticleType.setName("默认文章类型"); defaultArticleType.setParentId(articleTypeGroup.getId()); defaultArticleType.setIsGroup(CMSConstants.FALSE); defaultArticleType = articleTypeService.createArticleType(defaultArticleType); // 将文章的模板导入到动态属性实体中 Document doc = XMLDocUtil.createDoc(CMSConstants.TEMPLATE_ARTICLE_PROPERTY); Element root = doc.getRootElement(); root.addAttribute("name", defaultArticleType.getName()); root.addAttribute("code", defaultArticleType.getEntityCode()); propertyService.importDynableEntity(doc.asXML()); } protected void login(Long userId, String loginName) { OperatorDTO loginUser = new OperatorDTO(userId, loginName); String token = TokenUtil.createToken("1234567890", userId); IdentityCard card = new IdentityCard(token, loginUser); Context.initIdentityInfo(card); // 获取登陆用户的权限(拥有的角色)并保存到用户权限(拥有的角色)对应表 List<Object[]> userRoles = loginSerivce.getUserRolesAfterLogin(userId); permissionService.saveUserRolesAfterLogin(userRoles, userId); } }