`

easymock教程-单元测试中的主要测试对象和依赖

阅读更多

     在单元测试中,通常我们都会有一个明确的测试对象,我们测试的主要目的就是为了验证这个类的工作如我们预期。

 

     以下面的简单代码为例:

 

        public interface UserService {
            User query(String userId);
        }


        
public class UserServiceImpl implements UserService {
            
private UserDao userDao; 
            
public User query(String userId) {
                
return userDao.getById(userId);
            }

            
            
public void setUserDao(UserDao userDao) {
                
this.userDao = userDao;
            }

        }


        
public interface UserDao {
            User getById(String userId);
        }


        
public class UserDaoImpl implements UserDao {

            
private Datasource dataSource;

            
public User getById(String id) {
                User user 
= new User();
                
//execute database query
                user.set..
                
return user;
            }


            
public void setDatasource(Datasource datasource) {
                
this.datasource = datasource;
            }

            
        }



    这里我们定义有两个interface: UserService 和 UserDao, 并给出了两个实现类UserServiceImpl 和 UserDaoImpl。 其中UserServiceImpl依赖到UserDao,通过setter方法可以注入一个UserDao实现。而UserDaoImpl的实现则依赖到Datasource。

 

      然后我们来为实现类UserServiceImpl 和 UserDaoImpl编写单元测试:

 

 1. UserServiceImplTest

public class UserServiceImplTest {

    @Test
    
public void testQuery() {
        User expectedUser 
= new User();
        expectedUser.setId(
"1001");
        expectedUser.setAge(
30);
        expectedUser.setName(
"user-1001");
        UserDao userDao  
= EasyMock.createMock(UserDao.class);
        EasyMock.expect(userDao.getById(
"1001")).andReturn(expectedUser);
        EasyMock.replay(userDao);

        UserServiceImpl  service 
= new UserServiceImpl();
        service.setUserDao(userDao);
        User user 
= service.query("1001");
        assertNotNull(user);
        assertEquals(
"1001", user.getId()); 
        assertEquals(
30, user.getAge()); 
        assertEquals(
"user-1001", user.getName()); 

        EasyMock.verify(userDao);
    }

}

 

    在这个测试类中,主要测试对象就是UserServiceImpl,对于UserServiceImpl的依赖UserDao,我们采取mock这个UserDao来满足UserServiceImpl的测试需要。

 

 2. UserDaoImplTest

     代码示例就不详细写了,和上面的类似,主要测试对象就是UserDaoImpl, 我们将通过mock Datasource来满足UserDaoImpl对datasource的测试需要。

     可以从上面的例子中简单的看出,通常单元测试都遵循这样的惯例: AClass的单元测试类命名为AclassTest,主要职责是测试AClass的行为,理所当然的主要测试对象就是AClass。而所有被AClass的依赖则自然而然的成为次要测试对象,通常我们都不关注这些依赖的内部实现,也不会要求在AClass的单元测试案例中对这些依赖的实现进行测试和验证。

     这也符合单元测试的理念: 我们将类AClass定义为单元,测试这个单元的行为是否如预期。同时也符合UserServiceImpl的实现逻辑:UserServiceImpl依赖到UserDao接口,并不直接依赖到UserDaoImpl,因此在UserServiceImpl的单元测试中,也不应该引入UserDaoImpl这样的真实类,mock框架在这个时候是最适合出场表演的了:我们可以通过mock UserDao来模拟出UserDao的各种行为以便检测UserServiceImpl在这些行为下的处理是否正确: 不同的返回值,错误场景,异常场景。这也是mock框架在单元测试中被广泛使用的原因:还有什么比mock 类更能方便的做到这些?

 

 

分享到:
评论
4 楼 guji528 2012-12-31  
chainhou 写道
你好,我最近在看easyMock3.0的。一开始跑一个测试servlet的例子没跑起来,看了下文档是少cglib和objenesis这两个jar,down下来后又跑了下,结果提示是找不到方法:NoSuchMethodError:org.objectweb.asm.***这些,难道还有依赖?我加了asm.jar也没成功,这相当于环境也没搭起来吧。不知道为什么,希望能得到帮助,谢谢!


下面4个jar包可以让easyMock跑起来:
asm-3.3.1.jar
cglib-2.2.jar
easymock-3.1.jar
objenesis-1.2.jar
3 楼 skydream 2011-03-11  
to sword319: replay和verify请参考教程中的此文“easymock教程-record-replay-verify模型”,地址为

http://skydream.iteye.com/blog/829338

有详细介绍,希望能帮到你。
2 楼 sword319 2011-03-11  
得去下最新的asm.jar才可以.
楼主可以说说replay和verify是什么意思吗?
1 楼 chainhou 2011-02-11  
你好,我最近在看easyMock3.0的。一开始跑一个测试servlet的例子没跑起来,看了下文档是少cglib和objenesis这两个jar,down下来后又跑了下,结果提示是找不到方法:NoSuchMethodError:org.objectweb.asm.***这些,难道还有依赖?我加了asm.jar也没成功,这相当于环境也没搭起来吧。不知道为什么,希望能得到帮助,谢谢!

相关推荐

    powermock-easymock-junit-1.5.4.zip

    PowerMock与EasyMock是Java单元测试领域中的两个重要库,它们与JUnit结合使用,能够帮助开发者在测试过程中模拟复杂的对象行为和系统环境。这个压缩包"powermock-easymock-junit-1.5.4.zip"很可能包含了这三个库的...

    powermock-easymock-junit-1.6.1.zip

    在Java单元测试中,PowerMock和EasyMock是两个强大的库,它们扩展了JUnit的功能,使得开发者可以测试那些通常难以或无法直接测试的代码。PowerMock是基于EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类...

    easymock详解教程

    #### 1.3 easymock教程-单元测试中的主要测试对象和依赖 在单元测试中,通常会有一个主要的测试对象(即待测代码),以及一系列与之交互的其他对象(依赖)。这些依赖对象可能包括数据库、远程服务或其他组件。 ##...

    Junit+EasyMock单元测试使用资料以及案例分析

    Junit和EasyMock是Java领域中广泛使用的两个工具,它们协同工作,提供了强大的单元测试能力。本文将深入探讨这两个工具的使用,并通过案例分析帮助你更好地理解和应用它们。 **Junit简介** JUnit是Java编程语言中最...

    easymock教程.pdf

    ### 单元测试中的主要测试对象和依赖 * 主要测试对象:是指当前单元测试的目标对象。 * 依赖:是指主要测试对象所依赖的对象。 * 使用easymock可以模拟依赖对象的行为,从而简化单元测试。 ### easymock的record-...

    转:EasyMock 单元测试

    EasyMock 是一个流行的 Java 单元测试框架,它帮助开发者创建模拟对象来测试目标类的行为。这篇文档将深入探讨 EasyMock 的使用方法和原理,以便更好地理解和应用这一工具。 首先,让我们理解 EasyMock 的核心概念...

    4-EasyMock-Servlet.rar

    EasyMock是一个流行的Java模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以此来模拟复杂的系统交互。在Servlet环境下,EasyMock可以帮助我们测试独立于实际HTTP请求的Servlet行为,使得测试更加可控和...

    easymock-2.5.2工具 下载

    EasyMock 是一个强大的开源工具,专门用于生成模拟对象(Mock Objects),在软件开发特别是单元测试领域,它扮演着至关重要的角色。这个工具的版本为2.5.2,提供了对Java编程语言的支持,使得开发者能够方便地创建和...

    EasyMock单元测试例子

    EasyMock是一款流行的Java库,专门用于创建和控制模拟对象,使得单元测试更加简便。这个"EasyMock单元测试例子"提供了几个示例,帮助我们更好地理解和应用EasyMock。 EasyMock的基本概念: 1. **模拟对象(Mock ...

    easymock-3.1

    EasyMock 3.1 是一个流行的Java模拟框架,它允许开发者在单元测试中模拟对象的行为,以便更好地控制测试环境并确保代码的正确性。在这个压缩包中,我们找到了相关的文档和jar包,这些都是理解并使用EasyMock 3.1的...

    easymock教程.zip

    Easymock是一款强大的Java单元...通过阅读“easymock教程.pdf”,你将深入了解Easymock的使用方式,以及如何有效地集成到你的单元测试框架中,提升测试质量。记得在实践中不断探索和优化,以更好地利用这个强大的工具。

    easymock-3.2.zip

    EasyMock可以帮助程序员模拟对象的行为,使得测试过程更加可控,减少对真实环境的依赖。 在EasyMock 3.2这个版本中,主要包含以下几个组成部分: 1. **API文档**:这是EasyMock的接口文档,详细描述了各个类和方法...

    easymock教程[归纳].pdf

    2. **单元测试的主要测试对象和依赖** - 单元测试主要针对代码的最小可测试单元,如函数或方法。Easymock可以帮助隔离测试目标,通过模拟其依赖,确保测试的准确性和独立性。 3. **Record- Replay- Verify模型** ...

    easymock-request.getParamsNames

    在单元测试领域,Easymock 是一个非常流行的模拟框架,它允许开发者在不依赖真实环境的情况下测试代码。本文将详细讲解如何使用 Easymock 对 Servlet 进行单元测试,特别是针对 `HttpServletRequest` 中获取参数的...

    easymock教程

    ##### 1.2 单元测试中的主要测试对象和依赖 - **主要测试对象**:是指需要测试的功能模块或类,通常是开发者关心的核心部分。 - **依赖**:主要测试对象在执行过程中可能会调用其他对象(如数据库访问层、服务层等...

    Junit+EasyMock单元测试的jar包

    EasyMock则是一个模拟对象库,它可以创建虚拟对象,这些对象在测试中可以替代实际依赖的对象。在单元测试中,往往需要隔离被测试代码,避免外部因素的影响。EasyMock通过模拟对象可以实现这一目标,它允许开发者定义...

    easyMock.zip

    EasyMock 是一款强大的Java模拟框架,它允许开发者在单元测试中创建模拟对象,以替代真实对象,从而在不依赖外部环境的情况下进行测试。这个“easyMock.zip”文件包含了一个关于EasyMock使用的教程,特别是它的典型...

    easymock 3.0

    在单元测试中,Easymock允许我们创建mock对象,这些对象模仿真实对象的行为,但我们可以预定义它们的响应,以便于测试特定的代码路径。 首先,让我们深入了解一下Easymock的概念。Mock对象是代替实际对象的临时替代...

    Easymock教程

    Easymock是一款广泛使用的Java单元测试框架,它允许开发者创建和控制模拟对象,以便在测试过程中隔离被测代码,确保测试的准确性。本教程旨在帮助初学者快速掌握Easymock的基本用法和核心概念。 一、Easymock简介 ...

    单元测试中一些必要的jar包

    通过EasyMock,我们可以创建mock对象,这些对象可以模拟被测试类依赖的对象的行为,避免了在测试中实际调用外部系统或服务,从而保持测试的独立性和可预测性。 3. **PowerMock**:PowerMock是在EasyMock基础上的一...

Global site tag (gtag.js) - Google Analytics