测试 | Mock object
实例:
一个简单的图书管理系统包括三个类:
- Book提供了书籍的定义
- BookService提供了有关书籍借阅和归还的服务
- BookMananger查找书籍并把对书籍状态的更改更新到数据库中
目前,Book类和Bookservice类都已完成,但BookManager只是一个接口,对它的实现还没有完成。
目标: 对BookService类中的borrowBook和returnBook两个方法进行单元测试的代码,要求使用EasyMock模拟BookManager对象。
package org.demo.test.library; public class Book {
private String name;
private String isbn; //书号
private double price;
private boolean inShell; // 是否在架上 public Book(){}
public Book(String name, String isbn, double price,
boolean inShell){
this.name = name;
this.isbn = isbn;
this.price = price;
this.inShell = inShell;
} /**
* get set方法省略
**/
public boolean isInShell(){
return this.inShell;
}
public void setInShell(boolean inShell){
this.inShell = inShell;
} }
package org.demo.test.library; public class BookService {
private BookManager bookManager; public BookService(BookManager bookManager){
this.bookManager = bookManager;
} public boolean borrowBook (String isbn){
Book book = bookManager.findBook(isbn);
if (book != null && book.isInShell()){
//修改shell值
book.setInShell(false);
bookManager.updateBook(book);
return true;
}
return false;
}
public boolean returnBook (String isbn){
Book book = bookManager.findBook(isbn);
if (book != null && !book.isInShell()){
book.setInShell(true);
return true;
}
return false;
} }
package org.demo.test.library; public interface BookManager {
Book findBook(String isbn); // 根据isbn在数据库中找到相应的书籍
void updateBook(Book book); // 更新数据库中书籍的状态
}
package org.demo.test.library; import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.*; import org.demo.test.account.AccountManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.rules.ExpectedException; public class BookServiceTest { private BookManager bookManager;
private BookService bookService; @Before
public void setUp() throws Exception {
bookManager = createMock("bookManager",BookManager.class); bookService = new BookService(bookManager); } @Test
public void testBorrowBook() {
Book book1 = new Book("Java","123",20.2,true);
Book book2 = new Book("Web","124",20.9,false);
Book book3 = new Book("JavaScript","125",20.9,false); bookManager.updateBook(book1);
bookManager.updateBook(book2); /**
* 定义查询接口返回值
*/
expect(bookManager.findBook("123")).andReturn(book1);
expect(bookManager.findBook("124")).andReturn(book2);
expect(bookManager.findBook("126")).andReturn(null); /**
*
*/
replay(bookManager); /**
* 执行测试
*/
bookService.borrowBook("123");
bookService.borrowBook("124");
bookService.borrowBook("126"); assertEquals(false, book1.isInShell());
assertEquals(false, book2.isInShell());
} @Test
public void testReturnBook() {
Book book1 = new Book("Java","123",20.2,true);
Book book2 = new Book("Web","124",20.9,false); bookManager.updateBook(book1);
bookManager.updateBook(book2); expect(bookManager.findBook("123")).andReturn(book1);
expect(bookManager.findBook("124")).andReturn(book2);
expect(bookManager.findBook("126")).andReturn(null); replay(bookManager); bookService.returnBook("123");
bookService.returnBook("124");
bookService.returnBook("126"); assertEquals(true, book1.isInShell());
assertEquals(true, book2.isInShell()); }
}
测试 | Mock object的更多相关文章
- 使用模拟对象(Mock Object)技术进行测试驱动开发
敏捷开发 敏捷软件开发又称敏捷开发,是一种从上世纪 90 年代开始引起开发人员注意的新型软件开发方法.和传统瀑布式开发方法对比,敏捷开发强调的是在几周或者几个月很短的时间周期,完成相对较小功能,并交付 ...
- 测试之法 —— mock object
mock object 与真实对象相比,用来构造测试场景. 1. 一个实例 一个闹钟根据时间来进行提醒服务,如果过了下午5点钟就播放音频文件提醒大家下班了,如果我们要利用真实的对象来测试的话就只能苦苦 ...
- 置换测试: Mock, Stub 和其他
简介 在理想情况下,你所做的所有测试都是能应对你实际代码的高级测试.例如,UI 测试将模拟实际的用户输入(Klaas 在他的文章中有讨论)等等.实但际上,这并非永远都是个好主意.为每个测试用例都访问一 ...
- 自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程
项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java ...
- 假数据自我添加测试--NSArray object
一.列表假数据 //在.h文件里面定义node所包含实体类---1 struct listTestNode { NSString *image; NSString *name; }; //在.m实现文 ...
- Python单元测试和Mock测试
单元测试 测试可以保证你的代码在一系列给定条件下正常工作 测试允许人们确保对代码的改动不会破坏现有的功能 测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误 良好的测试要求模块化,解耦代 ...
- mock测试到底是什么?
经常听人说mock测试,究竟什么是mock测试呢?mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍,之后会有详细的mock测试,感谢大家对测试梦工厂的持续关注. 概 ...
- Mock测试框架
一.前言 使用Mock框架进行单元测试,能够使用当前系统已经开发的接口方法模拟数据.(未写完,慢慢完善) 二.例子 1.引用Moq
- Spring MVC如何测试Controller(使用springmvc mock测试)
在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...
随机推荐
- 【Effective C++】实现
条款26:尽可能延后变量定义式的出现时间 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造成了开始定义的对象并没有被使用,而付出了构造成本来析构成本. 所以我们应该在定义对象时,尽可能 ...
- AndroidDragAndDrop.java
以下代码使用ApiDemos-debug.apk进行测试 package com.saucelabs.appium; import io.appium.java_client.AppiumDriver ...
- Struts页面跳转问题
只有在web-INF中的jsp才可以不用加namespace名 <s:a action="systemIndexAction_turn" >跳转</s:a> ...
- 02-线性结构1 两个有序链表序列的合并(15 point(s)) 【链表合并】
02-线性结构1 两个有序链表序列的合并(15 point(s)) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L ...
- 前端面试常考知识点---CSS
前端面试常考知识点---js 1.CSS3的新特性有哪些 点我查看 CSS3选择器 . CSS3边框与圆角 CSS3圆角border-radius:属性值由两个参数值构成: value1 / valu ...
- C++模板(二)【转】
本文转自:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类 ...
- ansible快速学习
推荐文献: 表述的很不错, http://www.mamicode.com/info-detail-1428476.html 附加参考: http://laowafang.blog.51cto.com ...
- DGA域名——可以每天只生成一个域名,因此最多存在365个 DGA域名;
Mirai变种中的DGA 分享到: 发布时间:2016-12-12 16:02:57 作者:360网络安全研究院 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 那个导致美国断网 ...
- SecureCRT远程连接虚拟机CentOS的三种方式
当在VMware虚拟机中将CentOS安装成功后,会在win7系统中模拟出两个虚拟网卡:VMnet1和VMnet8,我们来查看一下,点击“控制面板—>查看网络状态和任务—>更改适配器设置” ...
- [Java] 练习题001:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1,2 ...