`

Spring服务层的测试JMock

 
阅读更多

 Spring服务层的测试JMock

本文转自 :http://blog.csdn.net/m13666368773/article/details/7026369

  Spring服务层的测试JMock

研究了2天,终于明白JMock怎么用了。其实原理很简单,模拟测试。

我们在用spring做开发的时候,通常会分N层结构,比如web layer(struts), service(spring),  DAO(ibatis)。开发是分层的,测试当然也分层。JMock的测试就是中间service层的测试。前提是保证DAO层,已经是OK的。(DAO层的测试我是用的spring-test做的,这个别的文章会说),JMock是帮你构造一个DAO的模拟对象,当你调用service代码时,service会调用Mock的对象,然后判断你调用的结果,是不是equal你模拟构造出的。

代码如下:
DTO数据模型:

  1. package com.dvs.biz.service.test;
  2. import org.apache.commons.lang.builder.ToStringBuilder;
  3. public class User {
  4.       public User() {}
  5.       public User(Integer id, String name) {
  6.             this.id = id;
  7.             this.name = name;
  8.       }
  9.       private Integer id;
  10.       private String name;
  11.       public Integer getId() {return id;}
  12.       public void setId(Integer id) {this.id = id;}
  13.       public String getName() {return name;}
  14.       public void setName(String name) {this.name = name;}
  15.       public String toString() {
  16.             return ToStringBuilder.reflectionToString(this);
  17.       }
  18. }

DAO 接口:

  1. package com.dvs.biz.service.test;
  2.  
  3. public interface UserDAO {
  4.       public User getUser(Integer id) throws Exception;
  5. }

DAO实现:


 

  1. package com.dvs.biz.service.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class UserDAOImpl implements UserDAO{
  7.  
  8. public User getUser(Integer id) throws Exception {
  9. System.out.println("UserDAOImpl");
  10. // some code for "sql"
  11. // 这里可以随便写点什么,因为这个DAO层是MOCK做,不会真正调度这些代码
  12.  
  13. return new User();
  14. }
  15. }

Service 接口:

  1. package com.dvs.biz.service.test;
  2.  
  3. public interface UserServ {
  4.       public User getUser(Integer id) throws Exception ;
  5. }

Service 的现实:

  1. package com.dvs.biz.service.test;
  2.  
  3. public class UserServImpl implements UserServ{
  4.       private UserDAO dao;
  5.  
  6.       public void setDAO(UserDAO dao) {
  7.             this.dao = dao;
  8.       }
  9.  
  10.       public User getUser(Integer id) throws Exception {
  11.             System.out.println("UserBusinessDelegate");
  12.             return dao.getUser(id);
  13.       }
  14. }

JMock的测试类:



 

  1. package com.dvs.biz.service.test;
  2.  
  3. import static org.junit.Assert.assertEquals;
  4.  
  5. import org.jmock.Expectations;
  6. import org.jmock.Mockery;
  7. import org.jmock.integration.junit4.JMock;
  8. import org.jmock.integration.junit4.JUnit4Mockery;
  9. import org.junit.Test;
  10. import org.junit.runner.RunWith;
  11.  
  12. @RunWith(JMock.class)
  13. public class UserServTest {
  14.       Mockery context = new JUnit4Mockery();
  15.  
  16.       @Test
  17.       public void getUser() throws Exception {
  18.             final UserDAO dao = context.mock(UserDAO.class);
  19.             UserServImpl ser = new UserServImpl();
  20.             ser.setDAO(dao);
  21.  
  22.             final User testuser = new User();
  23.             testuser.setId(2);
  24.             testuser.setName("list2");
  25.             
  26.             context.checking(new Expectations() {
  27.                   {
  28.                         one(dao).getUser(1);
  29.                         will(returnValue(testuser));
  30.                   }
  31.             });
  32.  
  33.             assertEquals(testuser,ser.getUser(1));
  34.             
  35.             context.assertIsSatisfied();
  36.       }
  37. }

one(dao).getUser(1);   //调用的dao的方法,和参数
will(returnValue(testuser)); //期待的返回值的结果

assertEquals(testuser,ser.getUser(1)); // 判断用ser调用的结果,是不是和dao返回的结果一样。

上面就是一个简短的小例子,我在这里的测试环境是jdk1.5.0,spring2.5, Junit4.4 , JMock2

分享到:
评论

相关推荐

    jmock jar包及doc文档

    例如,如果你有一个服务类依赖于一个DAO,你可以在测试中用JMock模拟DAO的行为,然后测试服务类的功能,而不实际访问数据库。这样可以提高测试速度,同时保证测试的独立性和可重复性。 在"jmock jar包及doc文档"中...

    软件测试资料集合,jtest,jmock

    本资源包包含了多个与单元测试相关的工具和框架,特别是与`jtest`和`jmock`相关的材料。 **jtest** `jtest`是一款强大的单元测试工具,特别适合Java开发者。它提供了一个集成的测试环境,帮助开发者编写、运行和...

    jmock2.5.1.zip

    jMock 2.5.1是该框架的一个版本,它在前一版本的基础上进行了优化和改进,以更好地服务于测试需求。 jMock的核心概念在于模拟(Mock Object)和期待(Expectation)。模拟对象可以替代真实的对象,在测试中扮演特定...

    Jmock2.6 jar包

    **Jmock2.6 Jar包**是Java编程领域中用于单元测试的重要库,它提供了模拟对象的功能,使得开发者能够在测试代码时对复杂依赖关系进行控制和隔离。在本文中,我们将深入探讨Jmock2.6的核心特性、使用场景以及如何在...

    jmock-2.5.1-javadoc

    《jMock 2.5.1:模拟对象与单元测试的艺术》 jMock是一个强大的Java模拟框架,它在软件开发的单元测试阶段扮演着至关重要的角色。jMock 2.5.1是该框架的一个版本,它提供了丰富的功能,帮助开发者创建虚拟对象,...

    JMock

    JMock 是一个流行的开源测试框架,专为Java开发者设计,用于模拟对象的行为,特别是在单元测试中。它允许程序员在不依赖真实对象的情况下测试代码,提高了测试的效率和隔离性。这篇详尽的讨论将深入JMock的核心概念...

    jmock cookbook 资源整合

    《JMock Cookbook资源整合》是关于Java测试领域中JMock库使用的详细指南,旨在帮助开发者更好地理解和运用这个强大的模拟框架。JMock是一个用于Java应用程序单元测试的工具,它允许程序员模拟对象的行为,以便在孤立...

    jmock-2.6.0-jars

    `jmock`是Java平台上的一个模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便能够隔离测试并精确地指定期望的交互。下面我们将深入探讨`jmock`的关键概念和功能。 ### 1. 模拟框架概述 `jmock`属于...

    JMOCK 帮助 网页 文档

    JMock 是一个Java平台上的单元测试框架,专门用于模拟对象,以便在测试过程中控制和验证对象的行为。它基于EasyMock库,但提供了更强大的功能,尤其是对于处理复杂交互和顺序的场景。JMock使得开发者可以在不依赖...

    JMock单元测试

    虽然在提供的例子中Mock要解决的问题并不明显,但在复杂的系统中,Mock对象可以用来模拟网络请求、数据库操作、外部服务调用等场景,从而允许开发者在没有真实外部依赖的情况下测试代码。这种方式可以提高测试的效率...

    jmock-1.2.0-jars.zip

    《JMock:模拟对象软件测试工具的深度解析》 在软件开发过程中,单元测试是确保代码质量的关键步骤。为了有效地进行单元测试,我们常常需要模拟(mock)对象,以便隔离测试目标并控制其行为。这就是JMock的作用所在...

    jmock-1.2.0-jars.rar

    《JMock 1.2.0 - 模拟与测试的艺术》 JMock 是一个流行的 Java 开源库,专门用于创建和管理模拟对象,以便在单元测试中隔离被测代码。这个压缩包“jmock-1.2.0-jars.rar”包含的是 JMock 1.2.0 版本的 jar 文件,它...

    JMOCK使用文档

    JMock是一款强大的模拟框架,专门用于Java应用程序的单元测试,特别是对于那些依赖于复杂外部接口或者服务的类。本文档将详细介绍JMock的使用方法及其与JUnit的结合。 1. **什么是JMock?** JMock是一个开源的Java...

    jmock2.5.1和easymock3.0

    而JMock和EasyMock则是两种广泛使用的Java单元测试框架,它们允许开发者模拟对象的行为和交互,以便于测试复杂的系统。本资源包含JMock 2.5.1和EasyMock 3.0的库文件,使得开发者在进行单元测试时无需再四处寻找相关...

    使用 FactoryBean结合Jmock实现动态Mock类的注入

    总结来说,通过结合`FactoryBean`和Jmock,我们可以方便地在Spring容器中动态地注入模拟对象,这对于单元测试和隔离被测试代码非常有帮助。这种技术可以有效地避免真实依赖对测试的影响,提高测试的效率和覆盖率。在...

    JMOCK-2.6.0

    《JMOCK-2.6.0:强化Java单元测试的艺术》 在软件开发的世界里,测试是确保代码质量不可或缺的一环。而JMOCK,作为一款强大的Java模拟框架,正是为了解决这一问题应运而生。"JMOCK-2.6.0"是一个专门用于项目测试的...

Global site tag (gtag.js) - Google Analytics