高效单元测试——EasyMock技术与应用

这篇具有很好参考价值的文章主要介绍了高效单元测试——EasyMock技术与应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.EasyMock 简介

2.EasyMock 实例

3.EasyMock 模型

3.1、record-replay-verify 模型

3.2、record

 3.3、replay

 3.4、verify

3.5、easymock部分功能说明

2. 记录mock对象期望的行为

4.EasyMock 应用

4.1、Easymock对AccountService进行测试

4.2、用Easymock对WebClient的测试

 ​编辑


1.EasyMock 简介

Mock 对象的弊端?

手动的构造 Mock 对象会给开发人员带来额外的编码量

为创建 Mock 对象而编写的代码很有可能引入错误

根据现有的接口或类动态生成 Mock 对象,能避免额外的编码工作,同时也降低了引入错误的可能。

EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。

提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。

通过 EasyMock,可以方便的构造 Mock 对象从而使单元测试顺利进行

easymock的官网    https://easymock.org/

高效单元测试——EasyMock技术与应用

2.EasyMock 实例

public class User {
	private String id;
	private String name;
	private int age;
	public String getId() {return id;}
	public void setId(String id) {this.id = id;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public User() {super();}
	public User(String id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
}
public interface UserService {
	User query(String userId);
}

 文章来源地址https://www.toymoban.com/news/detail-430093.html

public interface UserDao {
	User getById(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;
	}
}

定义两个interface:

  UserService 和 UserDao, 并给出了实现类UserServiceImpl 。 UserServiceImpl依赖到UserDao,通过setter方法可以注入一个UserDao实现。

使用mock object 技术测试UserServiceImpl

手动Mock的测试方法

class MockUserDao implements UserDao {
	private Map<String, User> users = new HashMap<String, User>();
	public void addUser(String userid, User user) {
		users.put(userid, user);
	}
	public User getById(String userId) {
		// TODO Auto-generated method stub
		return users.get(userId);
	}

完整测试方法

public class UserServiceImplTestWithMockObject {
	@Test
	public void testQuery() {
		User expectedUser = new User();
		expectedUser.setId("1001");
		expectedUser.setAge(30);
		expectedUser.setName("user-1001");
		
		MockUserDao mud = new MockUserDao();
		mud.addUser("1001", expectedUser);
 
		UserServiceImpl service = new UserServiceImpl();
		service.setUserDao(mud);
		User user = service.query("1001");
		assertNotNull(user);
		assertEquals("1001", user.getId());
		assertEquals(30, user.getAge());
		assertEquals("user-1001", user.getName());
	}
}

 如果使用EasyMock技术,如何实现,带来多大的方便???

高效单元测试——EasyMock技术与应用

 高效单元测试——EasyMock技术与应用

 

3.EasyMock 模型

3.1、record-replay-verify 模型

record-replay-verify 模型容许记录mock对象上的操作然后重演并验证这些操作。

是目前mock框架领域最常见的模型

几乎所有的mock框架都是用这个模型

3.2、record

        

UserDao userDao = EasyMock.createMock(UserDao.class);
EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);
创建mock对象,并期望这个mock对象的方法被调用,同时给出希望这个方法返回的结果。
这就是"记录mock对象上的操作", 同时也会看到" expect "这个关键字。
在record阶段,需要给出的是对mock对象的一系列 期望 :若干个mock对象被调用,依从给定的 参数,顺序,次数 等,并返回预设好的结果(返回值或者异常).

 3.3、replay

EasyMock.replay(mockUserDao);
		UserServiceImpl service = new UserServiceImpl();
		service.setUserDao(mockUserDao);
		User user = service.query("1001");    
replay 阶段,主要测试对象被创建,前面在 record 阶段创建的相关依赖被关联到主要测试对象,然后执行被测试的方法,以模拟真实运行环境下主要测试对象的行为。

 

在测试方法执行过程中,主要测试对象的内部代码被执行,同时和相关的依赖进行交互:

以一定的参数调用依赖的方法,获取并处理返回。
期待这个过程如在 record 阶段设想的交互场景一致,即期望在 replay 阶段所有在 record 阶段记录的行为都将被 完整而准确的重新演绎一遍 ,从而到达验证主要测试对象行为的目的。

 3.4、verify

nverify阶段,将验证测试的结果交互行为

assertNotNull(user);
assertEquals("1001", user.getId());
assertEquals(30, user.getAge());
assertEquals("user-1001", user.getName());

EasyMock.verify(userDao);

验证结果,即主要测试对象的测试方法返回的结果(对于异常测试场景则是抛出的异常)是否如预期,通常这个验证过程需要自行编码实现

                        EasyMock.verify(userDao);

                       验证交互行为,典型如依赖是否被调用,调用的参数,顺序和次数,这部分的验证过程通常是由mock框架来自动完成。

3.5、easymock部分功能说明

1. 创建mock对象

UserDao mockUserDao = Easymock.createMock(UserDao.class);

2. 记录mock对象期望的行为

Easymock.expect(mockUserDao.getById("1001")).andReturn(expectedUser);

这里记录了mock对象的行为:getById()方法被调用,调用次数为1

(easymock之中如果没有明确指出调用次数,默认为1),参数为"1001",expectedUser将作为返回值

3. 进入replay阶段

 Easymock.replay(mockUserDao);

4. 对mock对象执行验证

Easymock.verify(mockUserDao);

5. 指定期望的调用次数

Easymock.expect(mockUserDao.getById("1001")).andReturn(expectedUser).times(3);

6. 指定抛出期望的异常

Easymock.expect(mockUserDao.getById("1001")).andThrow(new RuntimeException("no user exist"));

7. 记录void 方法的行为:

如果mock对象的方法是void,则需要使用expectLastCall():

mockUserDao.someVoidMethod();

Easymock.expectLastCall();

和Easymock.expect(***)一样,同样支持指定调用次数,抛出异常等:

Easymock.expectLastCall().times(3);

Easymock.expectLastCall().andThrow(new RuntimeException("some error"));

8. 灵活的参数匹配

Easymock.expect(mockUserDao.getById(Easymock.isA(String.class))).andReturn(expectedUser);

类似的还有anyInt(),anyObject(), isNull() , same(), startsWith()等诸多实现。

4.EasyMock 应用

4.1、Easymock对AccountService进行测试

高效单元测试——EasyMock技术与应用

高效单元测试——EasyMock技术与应用

4.2、用Easymock对WebClient的测试

 

 高效单元测试——EasyMock技术与应用

 

 

 

到了这里,关于高效单元测试——EasyMock技术与应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 吃透单元测试:Spock单元测试框架的应用与实践

    一,单元测试 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法。程序是由函数组成的,每个函数都要健壮,这样才能保证程序的整体质量。单元测试是对软件未来的一项必不可少的投资。”具体来说,单元测试有哪些收益呢? 它是最容易保证代码覆盖率

    2024年02月09日
    浏览(50)
  • Java高级技术:单元测试、反射、注解

    目录 单元测试 单元测试概述 单元测试快速入门 单元测试常用注解 反射 反射概述 反射获取类对象 反射获取构造器对象 反射获取成员变量对象 反射获取方法对象 反射的作用-绕过编译阶段为集合添加数据 反射的作用-通用框架的底层原理 注解 注解概述 自定义注解 元注解

    2024年01月16日
    浏览(51)
  • 软件测试技术实验一 JUnit 单元测试的环境搭建

    1、确安装并配置 IntelliJ IDEA开发环境 2、安装插件Junit4.x,进行测试环境搭建 3、根据给定的源代码,编写测试代码,并运行成功。 1、调试指导书给定的目标源代码,除掉明显的语法错误,记录正确无误的被测程序代码。被测程序 : (1) Account.Java (2)Tc_Account.java (3)由插

    2024年04月28日
    浏览(44)
  • 软件测试技术之单元测试—工程师 Style 的测试方法

    什么是单元测试? Wikipedia 对单元测试的定义: 在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 在实际测试中,一个单元可以小到一个方法,也可以大到包含多个类。从定义上讲,单元测试和

    2024年02月12日
    浏览(61)
  • 软件质量保证与测试技术实验报告(四)——JUnit单元测试

    1.实验名称——JUnit单元测试 2.实验目的 (1)利用Junit进行单元测试,理解单元测试的任务、同时理解这类测试工具的实现原理; (2)理解断言的基本概念和断言测试方法; 3.实验内容 题目1:完成课件中Score_List的单元测试。 题目2:这是一个简单的计算器类——Computer,能

    2023年04月23日
    浏览(51)
  • 软件测试--应用JUnit进行单元测试

    JUnit是一个开源的Java编程语言的单元测试框架,最初由 Erich Gamma 和 Kent Beck 编写。Junit测试是一种白盒测试工具。JUnit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。具有JUnit经验对于应用“测试驱动开发(TDD)”的程序开发模型是非常重要的。 JUnit本质上是一套框

    2023年04月12日
    浏览(42)
  • 测试人进阶技能:单元测试报告应用指南

    为什么需要单元测试 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言,功能测试和系统测试以及其他性能测试等等对测试人

    2024年02月13日
    浏览(38)
  • 软件测试技术之单元测试—工程师 Style 的测试方法(2)

    怎么写单元测试? JUnit 简介 基本上每种语言和框架都有不错的单元测试框架和工具,例如 Java 的 JUnit、Scala 的 ScalaTest、Python的 unittest、JavaScript 的 Jest 等。上面的例子都是基于 JUnit 的,我们下面就简单介绍下 JUnit。 JUnit 里面每个 @Test 注解的方法,就是一个测试。@Ignore 可以

    2024年02月11日
    浏览(49)
  • 软件测试技术之单元测试—工程师 Style 的测试方法(3)

    如何设计单元测试? 单元测试设计方法 单元测试用例,和普通测试用例的设计,没有太多不同,常见的就是等价类划分、边界值分析等。而测试用例的设计其实也是开发者应该掌握的基本技能。 等价类划分 把所有输入划分为若干分类,从每个分类中选取少数有代表性的数据

    2024年02月12日
    浏览(65)
  • Java高级技术 单元测试(JUnit4)

    所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。 我们之前一直使用的测试便是通过main方法来实现,但在main方法中写测试代码有如下的几个问题存在: 只能在main方法编写测试代码,去调用其他方法进行测试。 无法实现自动化测试,一个方法测

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包