2019独角兽企业重金招聘Python工程师标准>>>

我们所有人在编写单元测试的时候面临的巨大挑战是模块对其他组件的依赖。同时花费大量的时间和精力去配置依赖的组件环境是一件出力不讨好的事情。使用Mock是一种有效地方式替代其他组件用来继续我们的单元测试构建过程。

接下来我将会展示一个使用mock技术的实例。这里我有一个数据访问层(简称DAL),建立一个类,提供应用程序访问和修改数据库中数据的基本API。接着我会测试这个DAL实例,但并不真正连接数据库。使用DAL类的目的是帮助我们隔离应用程序代码和数据显示层。

让我们通过下面的命令行创建一个java maven 项目。

<code><pre> mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=MockitoDemo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false </code></pre>

上述命令会创建一个名为MockitoDemo 的文件夹以及对应实体类的目录结构和测试文件。

请参考下面的例子来创建一个实体类:

package info.sanaulla.models;import java.util.List;/**
* Model class for the book details.
*/
public class Book {private String isbn;private String title;private List<String> authors;private String publication;private Integer yearOfPublication;private Integer numberOfPages;private String image;public Book(String isbn,String title,List<String> authors,String publication,Integer yearOfPublication,Integer numberOfPages,String image){this.isbn = isbn;this.title = title;this.authors = authors;this.publication = publication;this.yearOfPublication = yearOfPublication;this.numberOfPages = numberOfPages;this.image = image;}public String getIsbn() {return isbn;}public String getTitle() {return title;}public List<String> getAuthors() {return authors;}public String getPublication() {return publication;}public Integer getYearOfPublication() {return yearOfPublication;}public Integer getNumberOfPages() {return numberOfPages;}public String getImage() {return image;}
}

用来操作Book类的DAL类如下:

package info.sanaulla.dal;import info.sanaulla.models.Book;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;/**
* API layer for persisting and retrieving the Book objects.
*/
public class BookDAL {private static BookDAL bookDAL = new BookDAL();public List<Book> getAllBooks(){return Collections.EMPTY_LIST;}public Book getBook(String isbn){return null;}public String addBook(Book book){return book.getIsbn();}public String updateBook(Book book){return book.getIsbn();}public static BookDAL getInstance(){return bookDAL;}
}

DAL 层现在并没有实际的功能,我将尝试用测试驱动开发的方式来构建(TDD)。我们并不关心,DAL层是通过实体关系映射来进行数据通信还是通过其他数据库API来实现上面的操作。

#数据驱动的数据访问层

有很多单元测试框架和mock框架,这里我选择Junit单元测试框架和moke框架Mockito。我们需要在pom.xml配置文件中更新对他们的依赖。

   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 <a href="http://maven.apache.org/maven-v4_0_0.xsd">http://maven.apache.org/maven-v4_0_0.xsd"</a>><modelVersion>4.0.0</modelVersion><groupId>info.sanaulla</groupId><artifactId>MockitoDemo</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>MockitoDemo</name><url>http://maven.apache.org</url><dependencies><!-- Dependency for JUnit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!-- Dependency for Mockito --><dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency></dependencies>
</project>

现在我们编写BookDAL的单元测试类。通过单元测试,我们可以在BookDAL中注入mock对象进行单元测试而不用依赖其他数据源。

首先建立一个空的测试类,代码如下:

public class BookDALTest {public void setUp() throws Exception {}public void testGetAllBooks() throws Exception {}public void testGetBook() throws Exception {}public void testAddBook() throws Exception {}public void testUpdateBook() throws Exception {}
}

下面的代码中,我们在setUp方法中通过mock方式注入BookDAL对象

public class BookDALTest {private static BookDAL mockedBookDAL;private static Book book1;private static Book book2;@BeforeClasspublic static void setUp(){//Create mock object of BookDALmockedBookDAL = mock(BookDAL.class);//Create few instances of Book class.book1 = new Book("8131721019","Compilers Principles",Arrays.asList("D. Jeffrey Ulman","Ravi Sethi", "Alfred V. Aho", "Monica S. Lam"),"Pearson Education Singapore Pte Ltd", 2008,1009,"BOOK_IMAGE");book2 = new Book("9788183331630","Let Us C 13th Edition",Arrays.asList("Yashavant Kanetkar"),"BPB PUBLICATIONS", 2012,675,"BOOK_IMAGE");//Stubbing the methods of mocked BookDAL with mocked data. when(mockedBookDAL.getAllBooks()).thenReturn(Arrays.asList(book1, book2));when(mockedBookDAL.getBook("8131721019")).thenReturn(book1);when(mockedBookDAL.addBook(book1)).thenReturn(book1.getIsbn());when(mockedBookDAL.updateBook(book1)).thenReturn(book1.getIsbn());}public void testGetAllBooks() throws Exception {}public void testGetBook() throws Exception {}public void testAddBook() throws Exception {}public void testUpdateBook() throws Exception {}
}

在setUp方法中我通过下面这种方式

1.创建BookDAL实例:

BookDAL mockedBookDAL = mock(BookDAL.class);

2.Mokito API中DAL的mock对象,使用when方法接收调用mock对象的方法返回值参数。

//When getAllBooks() is invoked then return the given data and so on for the other methods.
when(mockedBookDAL.getAllBooks()).thenReturn(Arrays.asList(book1, book2));
when(mockedBookDAL.getBook("8131721019")).thenReturn(book1);
when(mockedBookDAL.addBook(book1)).thenReturn(book1.getIsbn());
when(mockedBookDAL.updateBook(book1)).thenReturn(book1.getIsbn());

实现其他的已经声明的测试方法:

package info.sanaulla.dal;import info.sanaulla.models.Book;
import org.junit.BeforeClass;
import org.junit.Test;import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;import java.util.Arrays;
import java.util.List;public class BookDALTest {private static BookDAL mockedBookDAL;private static Book book1;private static Book book2;@BeforeClasspublic static void setUp(){mockedBookDAL = mock(BookDAL.class);book1 = new Book("8131721019","Compilers Principles",Arrays.asList("D. Jeffrey Ulman","Ravi Sethi", "Alfred V. Aho", "Monica S. Lam"),"Pearson Education Singapore Pte Ltd", 2008,1009,"BOOK_IMAGE");book2 = new Book("9788183331630","Let Us C 13th Edition",Arrays.asList("Yashavant Kanetkar"),"BPB PUBLICATIONS", 2012,675,"BOOK_IMAGE");when(mockedBookDAL.getAllBooks()).thenReturn(Arrays.asList(book1, book2));when(mockedBookDAL.getBook("8131721019")).thenReturn(book1);when(mockedBookDAL.addBook(book1)).thenReturn(book1.getIsbn());when(mockedBookDAL.updateBook(book1)).thenReturn(book1.getIsbn());}@Testpublic void testGetAllBooks() throws Exception {List<Book> allBooks = mockedBookDAL.getAllBooks();assertEquals(2, allBooks.size());Book myBook = allBooks.get(0);assertEquals("8131721019", myBook.getIsbn());assertEquals("Compilers Principles", myBook.getTitle());assertEquals(4, myBook.getAuthors().size());assertEquals((Integer)2008, myBook.getYearOfPublication());assertEquals((Integer) 1009, myBook.getNumberOfPages());assertEquals("Pearson Education Singapore Pte Ltd", myBook.getPublication());assertEquals("BOOK_IMAGE", myBook.getImage());}@Testpublic void testGetBook(){String isbn = "8131721019";Book myBook = mockedBookDAL.getBook(isbn);assertNotNull(myBook);assertEquals(isbn, myBook.getIsbn());assertEquals("Compilers Principles", myBook.getTitle());assertEquals(4, myBook.getAuthors().size());assertEquals("Pearson Education Singapore Pte Ltd", myBook.getPublication());assertEquals((Integer)2008, myBook.getYearOfPublication());assertEquals((Integer)1009, myBook.getNumberOfPages());}@Testpublic void testAddBook(){String isbn = mockedBookDAL.addBook(book1);assertNotNull(isbn);assertEquals(book1.getIsbn(), isbn);}@Testpublic void testUpdateBook(){String isbn = mockedBookDAL.updateBook(book1);assertNotNull(isbn);assertEquals(book1.getIsbn(), isbn);}
}

然后我们通过maven的命令航方式:mvn test运行当前的项目。控制台输出如下:

\-------------------------------------------------------T E S T S
\-------------------------------------------------------
Running info.sanaulla.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
Running info.sanaulla.dal.BookDALTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.209 secResults :Tests run: 5, Failures: 0, Errors: 0, Skipped: 0

现在我们就实现了即使不配置数据源方式,而使用mock对象来测试DAL类。

#实例代码

网盘地址:MockitoDemo

转载于:https://my.oschina.net/dlpinghailinfeng/blog/377736

【翻译】Java使用Mockito进行Mock测试相关推荐

  1. 使用junit+mockito进行mock测试实例

    刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点--..一个大的程序启动又慢,还要登陆,还要 ...

  2. java junit mock_使用Mockito进行Java的Mock测试

    测试替身 dummy用于传递,不会真正使用,例如用于填充的方法的参数列表. Fake有简单实现,但通常被简化,比如在内存数据库,而不是真正的数据库中使用. Stub是接口或类中部分实现,测试时使用其实 ...

  3. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  4. Mock和Java单元测试中的Mock框架Mockito介绍

    什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...

  5. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  6. java的单元测试-mock测试

    文章目录 简介 Assert mockMVC 优化 mockBean(模拟bean和测试接口) 简介 对于普通的方法,通常采用断言测试. 对于接口,需要使用mockMvc 对于未开发的功能,需要moc ...

  7. Java的Mock测试到底怎么使用

    Java的Mockito测试如何使用 由于种种原因,我们暂时无法从数据库.或者依赖其他系统的接口中,无法获取到测试数据,我们难以对自己的接口顺利进行测试,所以我们可以使用Mockito测试框架来Moc ...

  8. mockito mock测试框架

    1.简介 mock,[mɒk],adj. 虚拟的,模拟的. 如果你的代码对另一个类或者接口有依赖,mock测试能够帮你模拟这些依赖,从而完成测试. 使用场景: 类A有一个方法fun(B b),它依赖于 ...

  9. 接口的Mock测试及Mockito使用

    参考链接 1.Mock测试的目的两个:(1)验证方法调用:(2)指定某个方法的返回值,或者是执行特定的动作 2.所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两大 ...

最新文章

  1. 关​于​h​i​b​e​r​n​a​t​e​中​双​向​外​键​关​联​o​n​e​-​t​o​-​o​n​e​的​p​r​o​p​e​r​t​y​-​r​e​f​=​的​问​题(转)...
  2. 第九章 Django框架——csrf请求伪造和csrf_token使用
  3. 【PAT乙级】1047 编程团体赛 (20 分)
  4. 手机开启开发模式 hbuilder无法搜索到_MIUI 12这个惊艳功能,其他手机也能一键开启...
  5. Windows下的bat原来可以为我们做很多
  6. PyTorch 1.0 中文文档:torch.utils.checkpoint
  7. iOS开发进阶-实现多线程的3种方法
  8. [2018.07.12 T2] B君的第二题
  9. 关于SSDP协议的基础知识
  10. SPSS Modeler 数据导入操作
  11. Postgresql skip locked跳过行锁消除行锁冲突等待
  12. 华为p8刷linux系统,在华为P8上轻松解锁Bootloader
  13. 门限签名技术火了,它的硬核之处绝不仅仅是秘密共享……
  14. 如何在Windows 10上退出安全模式
  15. MySQL中:一条update语句是怎样执行的
  16. 本版1年以内的所有 面经题目
  17. 阿里云服务器部署可道云
  18. Windows SubSystem for Linux(WSL)设置默认和设置默认登陆用户
  19. 七麦数据js爬虫(附代码)
  20. JS实现点赞变亮与取消点赞变灰样式

热门文章

  1. The Foundry MODO 13.0V1 特别版 Mac 三维建模设计软件
  2. insmod 提示 Invalid module format
  3. 已经变了….谈谈对现在大环境的一些想法与思考
  4. iOS代码编写利器AppCode
  5. 解决Serv-U服务停止的方法
  6. 欧拉公式——宇宙第一公式
  7. 苹果CEO乔布斯在斯坦福大学的演讲稿(中英对照版)
  8. linux进程优雅退出,Go 的信号处理和优雅退出
  9. manifest for java:8 not found: manifest unknown: manifest unknown
  10. CentOS无法识别NTFS格式U盘完美解决方案