新项目客户对测试的要求比较严格,要求单元测试的覆盖率为全部Java代码,所以问题就来了。
框架采用的仍然是Struts+Spring+Hibernate
1.Dao测试
这个没什么好说的,使用Spring-mock测试,直接连接数据库模拟真实环境,在开发中即时检验配置文件和代码的正确性。
2.Service层的测试
以往的测试没有对Dao进行mock,这样测试的缺点是效率低,每次测试都要跑Spring Context,而且不能脱离Dao达到测试业务逻辑的目的,所以目前尝试使用EasyMock,但是问题出现在Hibernate DetachedCriteria的使用上,就是我无法正确模拟DC,示例代码如下:
Service层:
java 代码
- private Dao dao;
- public setDao(Dao dao){
- this.dao = dao;
- }
- public void serviceMethod(String id) {
-
- DetachedCriteria dc = DetachedCriteria.forClass(Dao.class);
- dc.add(Restrictions.eq("id", Long.parseLong(id)));
-
- List resultList = new ArrayList();
- try {
- resultList = dao.findModelById(dc);
- } catch (Exception e) {
- //TODO
- }
- }
测试代码:MockServiceTest.java
java 代码
- public void testFindById() {
- dao = createMock(Dao.class);
- serviceImpl.setDao(dao);
-
- DetachedCriteria dc = EasyMock.createMock(DetachedCriteria.class);
- dao.findModelById(dc);
-
- expectLastCall().andReturn(new ArrayList());
- replay(dao);
-
- String id = "1";
- try {
- Model model = serviceImpl.serviceMethod(id);
- assertNotNull(department);
- } catch (Exception be) {
- be.printStackTrace();
- assertTrue(false);
- }
-
- verify(dictDao);
- }
这里就出现问题了,在MockServiceTest中模拟Dao是可以的,但是由于这个Dao方法findModelById需要一个参数DetachedCriteria,我试过很多方法模拟都不奏效,出现的错误都是:
java 代码
- java.lang.AssertionError:
- Unexpected method call findModelById(DetachableCriteria(CriteriaImpl(com.test.model.Model:this[][id=1]))):
- findAllByCriteria(EasyMock for class org.hibernate.criterion.DetachedCriteria): expected: 1, actual: 0
- at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)
- at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:45)
- at $Proxy0.findAllByCriteria(Unknown Source)
说是这个Dao方法不是预期被调用德方法,我试过其他的方法,如果参数是普通变量都没有问题,就是用了DC不行,所以我的问题就是DetachedCriteria真的无法模拟?如果可以用什么模拟? 具体方法?
3.Web Layer层测试:
由于Struts本身就很难于测试,起初选用StrutsTestCase测试,由于采用Spring托管的方式,所以必须在测试的过程中首先注入一个Spring的plugin-in,具体方法是在http://www.jetmaven.net/contents/documents/index.php找到的,但是原本貌似被删除了。
使用StrutsTestCase有几个问题:使用StrutsTestCase测试非常笨重,而且MockStrutsTestCase模拟的也不是很好,而且不大好分离测试。所以也考虑采用EasyMock来测试(网上有很多人推荐这种方式),但是并没有找到相应的实例,并且也有与上面相同的DetachedCriteria的问题。
综上,在这里求教单元测试使用EasyMock或者其他方法测试Struts、模拟DetachedCriteria的方案,谢谢。