实例:

  

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

  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. CentOS系统文件和目录管理相关的一些重要命令

    我们都知道,在Linux系统中,基本上任何我们需要做的事都可以通过输入命令来完成,所以在Linux系统中命令非常的多,我们不可能也没必要记住所有的这些命令,但是对于一些常用的命令我们还是必须要对其了如 ...

  2. BestCoder7 1002 Little Pony and Alohomora Part I(hdu 4986) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4986 题目意思:有 n 个box(从左到右编号依次为1~n),每个box里面有一个随机的钥匙,有可能这 ...

  3. 自定义标签(客户化jsp标签)

    客户化jsp标签技术是在jsp1.1版本中才出现的,他支持用户在jsp文件中自定义标签,这样可以使jsp代码更加简单,这些可重用的标签能够处理复杂的逻辑运算和事物或定义jsp网页的输出内容和格式. 创 ...

  4. 使用media来加载css

    默认的,css被当做渲染时候必须加载的资源. 设备类型和设备询问允许我们设置一些css资源编程可选的 对于所有的css资源,无论是必须的还是可选的,都会被浏览器加载 The New York Time ...

  5. WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  6. 001 - 配置Pycharm的字体大小

    本文记录的是Pycharm2017年1月版本 1 配置代码区的字体大小 位置在 File -> setting -> Editor -> Color&Fonts -> ...

  7. <十三>UML核心视图静态视图之业务用例图

    一:uml的核心视图 --->如果说UML是一门语言,上一章学习的参与者等元素是uml的基本词汇,那么视图就是语法.uml通过视图将基元素组织在一起,形成有意义的句子. --->uml可视 ...

  8. java-swing-JTextComponent

    package com.http; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Swi ...

  9. 九、myeclipse开发背景保护色设置

    window->preferences->Editors->Text Editors->Background color 背景颜色向你推荐: 色调:85.饱和度:1 2 3.亮 ...

  10. android实例3:拖动条

    个人网站http://www.ravedonut.com/ 拖动条改变图片的透明度 xml <LinearLayout xmlns:android="http://schemas.an ...