再谈ssh2测试
jiyanliang
2008-11-06
struts2+spring+hibernate结合AbstractTransactionalDataSourceSpringContextTests对action/service/dao进行测试,支持会滚,实在是太方便了。
测试类的基类 public class BaseActionTest extends AbstractTransactionalDataSourceSpringContextTests { @Override public String[] getConfigLocations() { String[] config = new String[] { "applicationContext-acegi.xml", "applicationContext-action.xml", "applicationContext-service.xml", "applicationContext-dao.xml", "applicationContext-db.xml", "applicationContext-mail.xml", "applicationContext-servlet.xml"}; return config; } public void testConfig() { assertNotNull("spring-mock has bean init()",this.applicationContext); } }其它action测试类继承它就可以了 看看下面action层的测试 public void testInput() throws Exception { adAction.setAdManageService(getAdManageService()); result = adAction.input(); assertEquals("add", result); } 简直和普通的方法一样。 当然,如果我们要测试service层的方法,还可以在基础测试类中增加private HibernateTemplate hibernateTemplate;,这样子类就可以很方便的调用this.getHibernateTemplate()方法了,太方便了。 但是使用了一段时间测试后,还发现了一些问题。 1 虽然可以使用spring-mock模拟出servlet容器,但是还是建议不要在方法中写诸如request.getParameter()之类的代码,这对于测试来时非常的不方便。在struts2中可以使用set/get来替换。 2 虽然spring的测试已经很全面了,但是我还没有发现基于Acegi安全角色的测试,使得我测试的时候不得不把方法上的标注给去掉再进行测试,不知道大家有什么好的解决方案。 //@Secured( { "ROLE_ADMIN" }) public String delete() { adManageService.delete(Integer.parseInt(this.getAd_id())); return "delete"; } 3 对于文件上传得方法进行测试,也非常的不方便,我不得不找一个真实路径的文件进行模拟,不知道spring-mock又没有这个方面的模拟,探寻中。。。。 4 另外还有一个问题就是,当我对dao层的delete(object);进行测试的时候,发现被删除的对象并没有消失,不知是否原因,未刷新?继续测试中。。。。 public void testDelete(){ ad = new Ad(); ad.setName(name); this.getAdDAO().save(ad); assertEquals(name, ad.getName()); ad = (Ad)this.getHibernateTemplate().find("from Ad where name = ?",name).get(0); this.getHibernateTemplate().delete(ad); assertEquals(null, ad);//错误,对象并不为null } |
|
kyo100900
2008-11-07
1.确实应该尽量用set/get
2.对acegi不熟悉 3.Javaeye上有一篇文章:http://charlescui.iteye.com/blog/221057 4.delete完成后,又变回 游离对象, 并不是null |
|
jiyanliang
2008-11-07
谢谢你的推荐!
确实不错! |
|
diddyrock
2008-12-09
lz比较专业,我都是直接搞spring 容器模拟,很麻烦,回去好好研究研究
|