实例:

  

一个简单的图书管理系统包括三个类:

  1. Book提供了书籍的定义
  2. BookService提供了有关书籍借阅和归还的服务
  3. 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的更多相关文章

  1. 使用模拟对象(Mock Object)技术进行测试驱动开发

    敏捷开发 敏捷软件开发又称敏捷开发,是一种从上世纪 90 年代开始引起开发人员注意的新型软件开发方法.和传统瀑布式开发方法对比,敏捷开发强调的是在几周或者几个月很短的时间周期,完成相对较小功能,并交付 ...

  2. 测试之法 —— mock object

    mock object 与真实对象相比,用来构造测试场景. 1. 一个实例 一个闹钟根据时间来进行提醒服务,如果过了下午5点钟就播放音频文件提醒大家下班了,如果我们要利用真实的对象来测试的话就只能苦苦 ...

  3. 置换测试: Mock, Stub 和其他

    简介 在理想情况下,你所做的所有测试都是能应对你实际代码的高级测试.例如,UI 测试将模拟实际的用户输入(Klaas 在他的文章中有讨论)等等.实但际上,这并非永远都是个好主意.为每个测试用例都访问一 ...

  4. 自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程

    项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java ...

  5. 假数据自我添加测试--NSArray object

    一.列表假数据 //在.h文件里面定义node所包含实体类---1 struct listTestNode { NSString *image; NSString *name; }; //在.m实现文 ...

  6. Python单元测试和Mock测试

    单元测试 测试可以保证你的代码在一系列给定条件下正常工作 测试允许人们确保对代码的改动不会破坏现有的功能 测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误 良好的测试要求模块化,解耦代 ...

  7. mock测试到底是什么?

    ​    ​经常听人说mock测试,究竟什么是mock测试呢?mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍,之后会有详细的mock测试,感谢大家对测试梦工厂的持续关注. 概 ...

  8. Mock测试框架

    一.前言 使用Mock框架进行单元测试,能够使用当前系统已经开发的接口方法模拟数据.(未写完,慢慢完善) 二.例子 1.引用Moq

  9. Spring MVC如何测试Controller(使用springmvc mock测试)

    在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...

随机推荐

  1. [NOIP2011提高组day1]-3-mayan游戏

    3.Mayan 游戏 (mayan.cpp/c/pas) [问题描述] Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  2. Codeforces Round #376 (Div. 2) C. Socks —— 并查集 + 贪心

    题目链接:http://codeforces.com/contest/731/problem/C 题解: 1.看题目时,大概知道,不同的袜子会因为要在同一天穿而差生了关联(或者叫相互制约), 其中一条 ...

  3. ansible-playbook unarchive模块

    先 进行  pause模块的 记录: pause 在playbook执行的过程中暂停一定时间或者提示用户进行某些操作 常用参数: minutes:暂停多少分钟 seconds:暂停多少秒 prompt ...

  4. BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告

    题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=530 (格式有一点点问题,直接粘 ...

  5. Constructing Roads In JGShining's Kingdom

    点击打开题目链接 本题目是考察  最长递增子序列的  有n^2     n(logn)  n^2  会超时的 下面两个方法的代码  思路  可以百度LIS  LCS dp里面存子序列 n(logn) ...

  6. hdu-5596 GTW likes gt(模拟+优先队列)

    题目链接: GTW likes gt  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/131072 K (Java/Othe ...

  7. [SDOI2012]任务安排

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2726 [算法] 此题与POJ1180非常相似 但是 , 此题中的t值可能为负 , 这 ...

  8. C++之构造函数、参数列表、析构函数

    参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485 构造函数之默认构造函数(调用的构造函数不用传递参数) 两种实例化方式都是默 ...

  9. mtk lk阶段的lcm流程

    一.lk进入kmain() 1. vendor/mediatek/proprietary/bootable/bootloader/lk/arch/arm/srt0.S bl kmain 二.初始化lk ...

  10. 【HDU5512】 2015沈阳赛区D题 规律题(GCD)

    第一篇博客,就从一个比较简单的题目入手吧! 题目: [HDU5512] 题意: 有n个塔,编号为1~n,  编号为a,b的塔已经维修好,此外其他的塔都需要维修.塔的维修是有顺序的,每次只能维修编号为k ...