`

Spring服务层的测试JMock

 
阅读更多
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. public interface UserDAO {
  3. public User getUser(Integer id) throws Exception;
  4. }

DAO实现:



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

Service 接口:

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

Service 的现实:

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

JMock的测试类:




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

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-2.6.0-jars

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

    jmock cookbook 资源整合

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

    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 Mock 没有接口的类

    通过这种方式,即使目标类没有接口,JMock 也能提供模拟功能,使得测试更加灵活和全面。这种技术在复杂的系统测试中尤其有用,因为它允许我们隔离和控制那些不易于直接测试的部分。不过,值得注意的是,模拟无接口的...

    JMOCK-2.6.0

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

Global site tag (gtag.js) - Google Analytics