`
yueguangyuan
  • 浏览: 337723 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

JUnit方案 DetachedCriteria模拟求解

阅读更多
    新项目客户对测试的要求比较严格,要求单元测试的覆盖率为全部Java代码,所以问题就来了。
    框架采用的仍然是Struts+Spring+Hibernate
    1.Dao测试
       这个没什么好说的,使用Spring-mock测试,直接连接数据库模拟真实环境,在开发中即时检验配置文件和代码的正确性。
    2.Service层的测试
       以往的测试没有对Dao进行mock,这样测试的缺点是效率低,每次测试都要跑Spring Context,而且不能脱离Dao达到测试业务逻辑的目的,所以目前尝试使用EasyMock,但是问题出现在Hibernate DetachedCriteria的使用上,就是我无法正确模拟DC,示例代码如下:
      
      Service层:
     
java 代码
 
  1. private Dao dao;
  2. public setDao(Dao dao){
  3.    this.dao = dao;
  4. }
  5. public void serviceMethod(String id) {  
  6.         // 构造查询条件  
  7.         DetachedCriteria dc = DetachedCriteria.forClass(Dao.class);  
  8.         dc.add(Restrictions.eq("id", Long.parseLong(id)));
  9.   
  10.         List resultList = new ArrayList();  
  11.         try {  
  12.             resultList = dao.findModelById(dc);  
  13.         } catch (Exception e) { 
  14.            //TODO
  15.         } 
  16.     }  
     测试代码:MockServiceTest.java
java 代码
 
  1. public void testFindById() {  
  2.     dao = createMock(Dao.class);  
  3.     serviceImpl.setDao(dao);  
  4.   
  5.     DetachedCriteria dc = EasyMock.createMock(DetachedCriteria.class);  
  6.     dao.findModelById(dc);  
  7.   
  8.     expectLastCall().andReturn(new ArrayList());  
  9.     replay(dao);  
  10.   
  11.     String id = "1";  
  12.     try {  
  13.         Model model = serviceImpl.serviceMethod(id);  
  14.         assertNotNull(department);  
  15.     } catch (Exception be) {  
  16.         be.printStackTrace();  
  17.         assertTrue(false);  
  18.     }  
  19.   
  20.     verify(dictDao);  
  21. }  
这里就出现问题了,在MockServiceTest中模拟Dao是可以的,但是由于这个Dao方法findModelById需要一个参数DetachedCriteria,我试过很多方法模拟都不奏效,出现的错误都是:
java 代码
 
  1. java.lang.AssertionError:   
  2.   Unexpected method call findModelById(DetachableCriteria(CriteriaImpl(com.test.model.Model:this[][id=1]))):  
  3.     findAllByCriteria(EasyMock for class org.hibernate.criterion.DetachedCriteria): expected: 1, actual: 0  
  4.     at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)  
  5.     at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:45)  
  6.     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的方案,谢谢。
分享到:
评论

相关推荐

    junit5.rar包含JUnit Platform + JUnit Jupiter + JUnit Vintage依赖jar包

    JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage,包含依赖包:junit-jupiter-5.5.1.jar,junit-jupiter-engine-5.5.1.jar,junit-jupiter-params-5.5.1.jar,junit-platform-launcher-1.5.1.jar,junit-...

    junit5-r5.5.2.zip

    - **模拟对象与依赖注入**:介绍如何使用Mockito等工具与JUnit 5结合,实现模拟对象的测试。 总之,JUnit 5的r5.5.2版本在保持易用性的同时,带来了更多的灵活性和可扩展性。无论是新手还是经验丰富的开发者,都...

    junit4.1 junit4.1

    junit4.1junit4.1junit4.1junit4.1junit4.1

    junit的jar包

    Files contained in junit4-4.8.2.jar: LICENSE.txt META-INF/MANIFEST.MF junit.extensions.ActiveTestSuite.class junit.extensions.RepeatedTest.class junit.extensions.TestDecorator.class junit.extensions...

    junit5.jar

    这个名为"junit5.jar"的文件正是JUnit 5的核心库,它包含了执行单元测试所需的所有核心组件,包括JUnit Platform、JUnit Jupiter和JUnit Vintage。本文将全面解析JUnit 5的关键特性和使用方法。 首先,JUnit ...

    Junit5.zip

    10. **测试配置**:`@TestPropertySource`和`@WithUserDetails`等注解允许在测试中配置环境变量和模拟用户身份。 通过研究和实践这个资源中的内容,开发者不仅可以深入了解JUnit5的内部机制,还可以掌握如何编写...

    JUnit API JUnit API

    JUnit API JUnit API JUnit API JUnit API JUnit API

    JUnit in Action 3nd Edition

    "JUnit in Action 3rd Edition" JUnit是一种流行的Java单元测试框架,由Kent Beck和Eric Gamma于1997年创立。JUnit在软件测试领域中扮演着重要的角色,帮助开发者编写高质量的代码。下面是关于JUnit的重要知识点: ...

    JUnit in action JUnit Recipies

    《JUnit in Action》和《JUnit Recipes》是两本关于Java单元测试的重要书籍,它们深入浅出地介绍了如何使用JUnit框架进行高效、可靠的测试。JUnit是一个流行的开源测试框架,广泛用于Java应用程序的单元测试,它提供...

    JUnit单元测试.zip

    8. **假对象和模拟**:介绍如何使用Mockito等库进行依赖注入的模拟,以便隔离测试。 9. **测试注解的高级用法**:如`@BeforeClass`、`@AfterClass`、`@Ignore`等,以及它们在不同场景下的应用。 10. **故障定位和...

    Junit5依赖整合包

    Junit5是Java开发中最常用的单元测试框架之一,它的出现为开发者提供了更加高效、灵活的测试体验。相较于之前的版本,Junit5引入了许多新的特性和改进,使得测试代码的编写和维护变得更加简单。本整合包包含了Junit5...

    JUnit3.8.1 以及使用JUnit测试的代码demo

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。JUnit3.8.1是该框架的一个较早版本,尽管现在已经有更新的版本(如JUnit5),但了解其基本...

    junit4 jar包

    此外,JUnit4可以与其他库(如Mockito、EasyMock等)结合使用,进行模拟对象和依赖注入,以实现更复杂的测试场景。 总结一下,"junit4 jar包"是Java开发中不可或缺的一部分,它提供了一套完善的单元测试工具和API,...

    Junit5.7.2离线jar

    JUnit是Java编程语言中最常用的单元测试框架之一,用于编写和运行可重复的自动化测试用例。Junit5.7.2版本是这个框架的一个稳定版本,提供了许多改进和新特性,使得测试更加高效且易于维护。这个离线jar文件包含了...

    JUnit in Action(JUnit经典书籍)中文+英文

    《JUnit in Action》是一本专为Java开发人员深入理解单元测试框架JUnit而编写的经典书籍。本书详尽地探讨了如何有效地使用JUnit进行软件测试,包括基础概念、高级特性和最佳实践,旨在帮助读者提升软件质量,降低...

    Junit4.4 Junit3.8.1

    7. **依赖注入**:JUnit 4支持依赖注入,便于在测试中模拟依赖对象。 `.CHM`文件是一种Windows的帮助文件格式,包含索引和搜索功能,可以帮助用户快速查找和学习JUnit 4.4和3.8.1的相关文档和教程。有了这个文件,...

    junit4 jar完整包

    TestNG提供了更丰富的测试注解和并行测试支持,而Mockito则是一个强大的模拟框架,可以帮助我们创建和配置模拟对象,隔离被测试代码,避免外部依赖对测试的影响。 在实际应用中,我们通常会结合构建工具如Maven或...

    junit-jupiter-5.5.1.rar

    JUnit5相关的 JUnit Jupiter.jar依赖包,主要包含: junit-jupiter-5.5.1.jar,junit-jupiter-api-5.5.1.jar,junit-jupiter-engine-5.5.1.jar,junit-jupiter-params-5.5.1.jar,junit-jupiter-api-5.4.2.jar,...

    junit jar包.rar

    10. 模拟对象(Mocks):虽然Junit自身并不包含模拟对象的功能,但通常与Mockito等第三方库结合使用,以创建和控制依赖对象的行为。 在Java项目中引入Junit jar包,你可以通过Maven或Gradle等构建工具进行管理,也...

    Junit 单元测试完整案例

    【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...

Global site tag (gtag.js) - Google Analytics