很想爆粗,就为了搞这个死人东西,花了姐姐我4个下午的时间,实在是令人发指,为了避免以后也花那么多时间去搞这个,在这里做个笔记以备以后查阅。
前提,在已经搭建出一个ssh项目的基础上增加junit4测试。
一、对action的struts和spring测试
1、导入jar包
junit-4.11、struts-junit-plugin-2.2.3(自己官方下载,这两个jar是关键,其他缺什么补什么)
2、为了项目方便,重载了StrutsSpringTestCase的一些函数,自定义了一个继承类用于公共用途
package com.scorpion.test.util;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsSpringTestCase;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* @author ZJ
* @作用 设置ssh的公共测试环境
* @创建日期 2013-10-10下午05:18:01
* @修改人
* @修改日期
* @修改内容 TODO
* @version V1.0
*/
public class BaseTestCase extends StrutsSpringTestCase {
/**
* @Field CONTEXT_LOCATION. 设置测试的spring配置
*/
private static final String CONTEXT_LOCATION = "test.xml";/** 这个很重要 **/
@Override
protected String[] getContextLocations() {
// TODO Auto-generated method stub
return new String[] {CONTEXT_LOCATION};
}
/**
* @Description: TODO
* @param sessionFactory
* the session factory.
* @return Session
* @throws
*/
@SuppressWarnings("deprecation")
protected Session getSession(SessionFactory sessionFactory){
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
FlushMode flushMode = FlushMode.NEVER;
if(null != flushMode){
session.setFlushMode(flushMode);
}
return session;
}
/**
* @Description: TODO
* @param request
* the http request.
* @return SessionFactory
*/
protected SessionFactory lookupSessionFactory(HttpServletRequest request){
return (SessionFactory) this.applicationContext.getBean("sessionFactory");
}
/**
* @Description: 重载setUp函数,解决(hibernate+spring)jpa的lazy延迟加载问题
* @throws Exception
* java.lang.Exception.
*/
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
SessionFactory sessionFactory = this.lookupSessionFactory(request);
Session hibernateSession = this.getSession(sessionFactory);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession));
}
}
3、接着是action test(有很多junit4的新特性和方便的地方由于整合的一些问题,没有体现出来,会在日后进行更新,让它更加完善)
package com.main.test.testcase;
import org.junit.Test;
import com.opensymphony.xwork2.ActionProxy;
import com.scorpion.test.util.BaseTestCase;
/**
* @author ZJ
* @作用 测试登录
* @创建日期 2013-9-29下午07:51:17
* @修改人
* @修改日期
* @修改内容 TODO
* @version V1.0
*/
public class LoginActionTest extends BaseTestCase{
/**
* @Field ACTION_NAME.
*/
private static final String ACTION_NAME = "userLogin.action";
/**
* @Description: 测试execute函数内的逻辑代码
*/
@Test
public void testExecuteParams() {
try {
// request paramter's data not in database
request.setParameter("uName", "12");
request.setParameter("pwd", "11");
ActionProxy proxy = this.getActionProxy(ACTION_NAME);
String result = proxy.execute();
assertEquals("error",result);
// request paramter's data is invalid.
request.setParameter("uName", "");
ActionProxy proxy1 = this.getActionProxy(ACTION_NAME);
String result1 = proxy1.execute();
assertEquals("error",result1);
// request paramter's data in database
request.setParameter("uName", "bb");
request.setParameter("pwd", "aa");
ActionProxy proxy2 = this.getActionProxy(ACTION_NAME);
String result2 = proxy2.execute();
assertEquals("success",result2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
opensession
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
singleSession
true
sessionFactoryBeanName
sessionFactory
5、spring链接数据库部分是在2中有谈到的test.xml文档,其里面的内容
classpath*:application.properties
${hibernate.dialect}
${hibernate.show_sql}
${hibernate.format_sql}
以上就是一个完整的testcase的配置和junit代码编写,为了方便管理test case,还可以写test suite
package com.main.test.testsuite;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import com.main.test.testcase.LoginActionTest;
/**
* @author ZJ
* @作用 用户管理模块的所有test case的集合
* @创建日期 2013-9-30下午03:32:30
* @修改人
* @修改日期
* @修改内容 TODO
* @version V1.0
*/
@RunWith(Suite.class)
@SuiteClasses({LoginActionTest.class})
public class UserTestSuite {
}
二、对spring service impl的测试
1、需要的jar包:
junit-4.11、spring-test
2、编写继承AbstractTransactionalJUnit4SpringContextTests类的公共类,注意@ContextConfiguration(locations = {"classpath:test.xml"})的配置,链接数据库用的
package com.scorpion.test.util;
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;
import org.springframework.test.context.transaction.TransactionConfiguration;
/**
* @author ZJ
* @作用 junit4对spring的单元测试公共测试类,@ContextConfiguration读取spring的配置
* @创建日期 2013-10-11下午06:43:24
* @修改人
* @修改日期
* @修改内容 TODO
* @version V1.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test.xml"})
@TransactionConfiguration(defaultRollback = true)
public class SpringBaseTestCase extends
AbstractTransactionalJUnit4SpringContextTests {
}
package com.main.test.testcase.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.sql.Timestamp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.main.entity.User;
import com.main.service.UserService;
import com.scorpion.test.util.SpringBaseTestCase;
/**
* @author ZJ
* @作用 为service编辑test case
* @创建日期 2013-10-11下午05:58:06
* @修改人
* @修改日期
* @修改内容 TODO
* @version V1.0
*/
public class UserServiceImplTest extends SpringBaseTestCase{
/**
* @Field userService.
*/
@Autowired
private UserService userService;
/**
* @Description: 初始化测试环境
* @throws Exception
* java.lang.exception.
*/
@Before
public void setUp() throws Exception {
}
/**
* @Description: 测试完后清理现场
* @throws Exception
* java.lang.exception.
*/
@After
public void tearDown() throws Exception {
}
/**
* @Description: 增加用户到数据库
*/
@Test
public void saveUser(){
User user = new User();
user.setuName("zhongjie");
user.setPwd("123456");
user.setCreateTime(new Timestamp(System.currentTimeMillis()));
userService.addUser(user);
}
/**
* @Description: 根据用户名查找用户
*/
@Test
public void getUserByName(){
User user = new User();
user.setuName("zhongjie");
user.setPwd("123456");
user.setCreateTime(new Timestamp(System.currentTimeMillis()));
userService.addUser(user);
User gUser = userService.getUser(user.getuName());
assertNotNull(gUser);
assertEquals(user.getPwd(),gUser.getPwd());
}
}