mockito java_使用Mockito在Java中进行模拟入门

mockito java

我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件。 并且配置其他组件进行单元测试绝对是一个过大的选择。 相反,我们可以使用Mocks代替其他组件,并继续进行单元测试。

为了说明如何使用模拟,我有一个数据访问层(DAL),基本上是一个类,为应用程序提供API,以供应用程序访问和修改数据存储库中的数据。 然后,我对DAL进行单元测试,而实际上无需连接到数据存储库。 数据存储库可以是本地数据库或远程数据库,也可以是文件系统,也可以是我们可以存储和检索数据的任何位置。 DAL类的使用有助于我们将数据映射器与应用程序代码分开。

让我们使用maven创建一个Java项目。

mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=MockitoDemo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

上面创建了一个文件夹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时不关心的ORM映射器或数据库API通信。

测试DAL层

Java中有许多用于单元测试和模拟的框架,但是对于这个示例,我将选择JUnit用于单元测试,选择Mockito用于模拟 。 我们将不得不更新Maven的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 http://maven.apache.org/maven-v4_0_0.xsd"><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中,以便我们无需依赖数据源即可完成API的测试。

最初,我们将有一个空的测试类:

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 {}
}

我们将把模拟的BookDAL和模拟的数据注入到setUp() ,如下所示:

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. 在BookDAL的API中添加模拟数据,以便在调用API时返回模拟数据。
    //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

因此,我们能够测试DAL类,而无需通过使用模拟程序实际配置数据源。

参考:来自Experiences Unlimited博客的JCG合作伙伴 Mohamed Sanaulla的Mockito 使用Java进行Mocking入门 。

翻译自: https://www.javacodegeeks.com/2014/02/getting-started-with-mocking-in-java-using-mockito.html

mockito java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交换机的三种连接方式:级联、堆叠和集群

交换机的连接方式大家应该都知道&#xff0c;一共有三种&#xff0c;分别是&#xff1a;级联、堆叠和集群。今天&#xff0c; 就由飞畅科技的小编来为大家详细介绍下交换机的这三种连接方式及彼此间的区别&#xff0c;感兴趣的朋友就一起来看看吧&#xff01; 交换机的级联技术…

【渝粤教育】国家开放大学2018年春季 0177-22T电机学(二) 参考试题

编号&#xff1a;0177 b 2017-2018年度第二学期期末考试 电机学&#xff08;2&#xff09; 试 题 2018年 7 月 一、填空题&#xff08;每空4分 &#xff0c;共40分&#xff09;1&#xff0e;一台隐极三相同步发电机时空向量中j轴与A轴重合&#xff0c;某瞬间转子基本波励磁磁动…

【渝粤教育】国家开放大学2018年春季 0234-22T公务员制度讲座 参考试题

科目编号&#xff1a;0234 座位号 2017-2018学年度第二学期期末考试 公务员制度讲座 试题 2018年 7 月 一、名词解释&#xff08;本大题共2小题&#xff0c;每小题10分&#xff0c;共计20分&#xff09; 1&#xff0e;公务员奖励制度 2&#xff0e;选任制 二、单选题&#x…

交换机组最常见的8大故障及解决方法

在交换机组网时常见的故障比较多&#xff0c;为了帮助大家更好地排除这些故障&#xff0c;在此飞畅科技的小编来为大家介绍一些常见的典型故障案例和处理思路供大家参考。接下来大家就一起来看看交换机组最常见的8大故障及解决方法吧。 环网交换机产品图 故障1&#xff1a;交…

【渝粤教育】国家开放大学2018年春季 0273-22T中国现代文学 参考试题

试卷编号&#xff1a;0273 座位号 2017——2018学年度第二学期期末考试 中国现代文学 试题 2018年7月 1&#xff0e;闻一多分别于1923年和1928年出版了两部诗集&#xff0c;第一部是《__________》&#xff0c;第二部是《___________》。 2&#xff0e;《__________》是鲁迅唯…

【渝粤教育】国家开放大学2018年春季 0341-22T高级英语听力(2) 参考试题

试卷代码&#xff1a;0341 2017-2018学年度第二学期期末考试 高级英语听力&#xff08;2&#xff09;试题 2018年7月 注 意 事 项 一、将你的准考证号、学生证号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸规定栏内。 考试结束后&#xff0c;把试卷和答题纸放…

中北大学 软件构造 U+及上课代码详解

作业1 1.数据类型可分为两类:(原子类型) 、结构类型。 2.(数据结构)是计算机存储、组织数据的方式&#xff0c;是指相互之间存在一种或多种特定关系的数据元素的集合 3.代码重构指的是改变程序的(结构)而不改变其行为&#xff0c;以便提高代码的可读性、易修改性等。 4.软件实…

如何挑选家用交换机 交换机选购攻略分享

现如今&#xff0c;伴随着网络的迅速普及&#xff0c;交换机的“身影”也开始出现在不少普通个人用户家庭中。不过许多家庭用户在挑选交换机时&#xff0c;往往都会将注意力集中到交换机的扩展性能上&#xff0c;他们一味地追求交换机的接口数要多&#xff1b;其实&#xff0c;…

php cdi_使用CDI的InjectionPoint注入配置值

php cdi依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从DI容器提供的。 但是您的配置呢&#xff1f; 当然&#xff0c;您可以创建一个“ Configuration”类&#xff0c;并在需要它的任何地方注入该类&#xff0c;并从中获取必要的值。 但是…

mysql 5.7 pxc_mysql5.7 PXC安装记录

环境信息172.31.217.182 bd-dev-mingshuo-182172.31.217.183 bd-dev-mingshuo-183172.31.217.89 bd-dev-vertica-89依赖关系1.安装Percona-XtraBackup(依赖libev-4.03-3.el6.x86_64.rpm)2.yum install -y git scons gcc gcc-c openssl check cmake bison boost-devel asio-…

【渝粤教育】国家开放大学2018年春季 0529-21T高级英语阅读(1) 参考试题

科目编号&#xff1a;0529 座位号&#xff1a; 四川电大2017─2018学年度第二学期期末考试 高级英语阅读&#xff08;1&#xff09;试题 &#xff08;开卷&#xff09; 2018年7月 注 意 事 项 一、 将你的准考证号、学生证号、姓名及分校&#xff08;工作站&#xff09;名称填写…

【渝粤教育】国家开放大学2018年春季 0599-21T工程造价管理基础理论与相关法规 参考试题

科目编号&#xff1a;0599 座位号 2017-2018学年度第二学期期末考试 工程造价管理基础理论与相关法规 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题4分&#xff0c;共计40分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题…

旧访客设计模式的新生活

介绍 访客 [1、2]是众所周知的经典设计模式。 有很多资源对其进行了详细说明。 在不深入研究实现的情况下&#xff0c;我将简要提醒一下该模式的概念&#xff0c;解释其优点和缺点&#xff0c;并提出一些可以使用Java编程语言轻松应用于其的改进。 古典游客 [Visitor] 允许在运…

一台PoE工业交换机可以给多少设备供电?

在安防监控领域&#xff0c;现在使用的很多网络设备都支持PoE供电,在网络监控施工中&#xff0c;为了减少布线成本以及更加方便快捷&#xff0c;绝大多数工程商会考虑采用PoE供电&#xff0c;即采用PoE交换机给监控摄像头供电。那么&#xff0c;一台PoE工业交换机可以给多少设备…

oracle不维护java_宣布 Java 8 停止维护后,Oracle 又毙掉了 JavaOne!

2019 年 1 月之后&#xff0c;Oracle 将不会在网站上发布 Java SE 8 商业使用的更新下载。如需持续获取安全的 bug 修复和安全补丁以及 Java SE 8 或以前版本的稳定性支持&#xff0c;可以通过 Oracle Java SE 高级版&#xff0c;Oracle Java SE 高级桌面&#xff0c;或 Oracle…

【渝粤教育】国家开放大学2018年春季 0674-22T财务管理 参考试题

科目编号&#xff1a;[0674] 座位号 2017-2018学年度第二学期期末考试 财务管理 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&#xff09; …

【渝粤教育】国家开放大学2018年春季 0699-22T阅读与写作 参考试题

试卷代码&#xff1a;0699 2017-2018学年第2学期期末考试 阅读与写作 (闭卷) 2018年5月 一、阅读以下文章&#xff0c;并回答问题。&#xff08;共40分&#xff09; 雁南飞 胡 同 ①春天来了&#xff0c;小燕子乘着南风伴着细雨再一次回到了北方的那个屋檐下。看着它们忙忙碌…

python dict初始化大小_在Python中初始化/创建/填充Dict的Dict

我必须在为我的研究编写代码时经常这样做。您将希望使用defaultdict包&#xff0c;因为它允许您添加键&#xff1a;值对在任何级别上&#xff0c;通过简单的分配。回答完你的问题我会给你看的。这是直接来源于我的一个程序。关注最后4行(不是注释)并在块的其余部分跟踪变量&…

q7goodies事例_Java 8 Friday Goodies:本地交易范围

q7goodies事例在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个…

以太网交换机和路由器的区别,二者有共同点吗?

您知道以太网交换机和路由器有什么不同吗&#xff1f;在osi七层模型上来分析&#xff0c;交换机在第二层工作&#xff0c;路由器在第三层上工作。交换机查找某一台电脑的方式是通过查找mac地址&#xff0c;就是通过您网卡上固有的一个唯一识别编号来进行查找的。路由器查找一台…