模拟对象测试——EasyMock

一、EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求

1、要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试;

2、涉及到数据库操作,但当时条件连接不了数据库或你不想将自己的测试结果改动到数据库;

3、模块依赖于spring容器注入其它服务实例,但你又不想启动spring容器。

总之,EasyMock能帮我们模拟出任何我们想要的支持对象,并且我们可以使用这些对象进行逻辑操作

二、具体使用方法

1、模拟成员变量

EasyMock.createMock(要模拟的成员变量类型);

2、设定模拟成员的函数行为

1)有返回值

Easymock.expect(模拟成员的某个要模拟的函数).andReturn(期待的返回值)

2)没返回值

首先模拟成员调用要模拟的函数,然后在后面跟上一句:EasyMock.expectLastCall(),如果希望为该函数加上一个返回,可以用:

EasyMock.expectLastCall().andAnswer(new IAnswer<任何类型>(){
  public String answer() throws Throwable {
    log.info(EasyMock.getCurrentArguments()[0]);//打印参数,以确定传参是否准确([0]表示第一个参数)
    return 作何类型;
  }
});

因为完全没返回又没日志输出的时候,你可能很难确定这个函数的操作结果是什么

3、模糊参数

有时候要模拟的函数的参数是在程序运行过程中调用的,参数值来自于程序执行结果,这时可以用模糊参数来解决,模糊参数有:

isA、isNull、anyInt等

4、开始测试

EasyMock.replay(模拟成员);

三、实例

1、要测试的类

public class UserServiceImpl{
  private UserDao dao;
  public List<String> queryNames(String[] ids) throws Exception{
    try{
      return dao.getNames(ids);
    }catch(Exception e){
      throw e;
    }
    return null;
  }
}

该类依赖UserDao,但UserDao可能还没实现,或要靠spring容器来注入

2、测试代码

@Test
public void test() {

  String[] ids = {‘1‘,‘2‘,‘3‘};

  List<String> returnNams = Arrays.asList("a,b,c".split(","));

  UserDao userDaoMock = EasyMock.createMock(UserDao.class);//创建模拟成员

  EasyMock.expect(userDaoMock.getNames(ids )).andReturn(returnNams);

EasyMock.replay(userDaoMock );//重放Mock对象

  UserServiceImpl userServiceImpl = new UserServiceImpl();

  userServiceImpl .queryNames(ids);//目标类调用目标方法

  EasyMock.verify(userDaoMock );//验证Mock对象

}

时间: 2024-10-12 15:48:11

模拟对象测试——EasyMock的相关文章

单元测试——使用模拟对象做交互测试

最近在看.net单元测试艺术,我也喜欢单元测试,这里写一下如何在测试中使用模拟对象. 开发的过程中,我们都会遇到对象间的依赖,比如依赖数据库或文件,这时,我们需要使用模拟对象,来进行测试,我们可以手写模拟对象,当然也可以使用模拟框架. 假如有这样的一个需求,当用户登陆时,我需要对用户名和密码进行验证,然后再将用户名写入日志中. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class MyLogin     {         pu

打破依赖,使用模拟对象,桩对象,隔离框架

打破依赖,使用模拟对象,桩对象,隔离框架 在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,隔离框架 创建优秀的单元测试 本节索引: 伪对象.桩对象. 模拟对象 为什么需要伪对象,如何处理 手工新建伪对象 使用隔离框架创建伪对象 伪对象(fake) 桩对象(stub) 模拟对象(mock) 伪对象是一个通用术语,它即可指

springBoot单元测试-模拟MVC测试

1)模拟mvc测试,和基础测试是一样的, 都需要在pom文件中引入junit的支持. 略 2)编写测试类 Application1TestMVC 在类头上除啦加入之前的@RunWith(SpringRunner.class).@RunWith(SpringRunner.class) 之外还要加入新的注解 @AutoConfigureMockMvc // 注入MockMvc (当然你实在不想加也行,有其他办法 , 不过我不想说,麻烦) 1 package com.cx.springboot; 2

【原创】junit4中Assert断言的使用以及Mockito框架mock模拟对象的简单使用

编写测试代码时,我们总会有我们对被测方法自己预期的值,以及调用被测方法后返回的真实执行后的值.需要断言这两个值是否相等.抛出异常.hash码等等情况... 这里博主主要介绍一下简单的断言和mock.如果已经对junit测试有过相对了解的,请略过这篇文章. 下面是我准备的节点类: 1 package demo; 2 3 /** 4 * @author Lcc 5 * 6 */ 7 public class Node { 8 private int value; 9 10 public Node(i

模拟IP测试的2种解决方法 [ 光影人像 东海陈光剑 的博客 ]

背景: 之前遇到一个Labs日常需求是对于不同IP地址访问有逻辑判断,例如湖南的IP可以访问,其他地域的IP地址无法访问应用. 难点: 在测试过程中访问应用时,本地地址无法改变,始终为同一地址.对于不同IP地址段的需求无法测试 解决方案一 使用Debug方式远程调试代码 思路:通过本地发起Http请求,连接daily机或开发机,设置断点.当请求到达断点处,修改IP地址信息,模拟任意的IP地址请求.处理结果看返回信息 ? 步骤一:使用Eclipse工具Debug方式,连接daily机\开发机 ?

Api开发者福利之api在线管理,模拟请求测试,文档生成工具--Apizza

Apizza (http://apizza.cc?f=51cto) 平台分为开发模式和浏览模板,开发模式只有用户自己可以打开,浏览模式是供其他人查看,测试使用. 平台支持标准的http协议请求,支持添加header,支持标准 json,xml,html,text四种返回格式, 自动格式化展示.平台做了许多体验优化,比如参数列表和url自动转换, 请求文档字段一键生成.响应文档的字段可以从api返回自动生成.请求自动存为历史记录, 支持定义的环境变量,可以方便切换线下,下上环境,文档导出等等. 下

java class对象测试

java 类对象 jvm在 加载 .class的时候 会创建该类唯一的class对象 以后无论创建多少个实例,该class对 象是不变的. 每一个class对象 getClass() 都会获得同一个class对象 class java.lang.Class ,该对象是唯一不变的.  public void test() {   System.out.println("这是test...方法....");  }  private static void test2() {   try {

[python学习篇][书籍学习][python standrad library][内置类型]对象测试真值,布尔值操作, 比较操作

几乎所有对象都可以比较.测试真值.转换为字符串(其实就是用repr()函数,或略有差异的str()函数来转换) 1 对象是否为真 任何对象都可以测试真值,用于if或while的条件或下面布尔运算的操作数.下面的值被视为假: None False 任何数值类型的零,例如,0. 0L.0.0. 0j. 任何空的序列,例如, ''. (). []. 任何空的映射,例如,{}. 用户定义的类的实例,如果该类定义一个__nonzero__()或__len__()的方法,在该方法返回整数零或布尔值False

对象测试

1. PL / SQL创建对象CREATE OR REPLACE TYPE typ_address AS OBJECT ( street VARCHAR2(30), city VARCHAR2(20), state CHAR(2), postal_code VARCHAR2(6) ); CREATE OR REPLACE TYPE typ_employee AS OBJECT( employee_id NUMBER(6), first_name VARCHAR2(20), last_name V