1.概述

在本教程中,我们将演示如何最大限度地利用间谍在5

我们会讲到金宝搏官网188be@Spy注释,如何消灭间谍,最后-我们将进入的区别模拟间谍

当然,为了更多的Mockito善行,在这里看看这个系列

进一步阅读:

5验证食谱

5验证示例、用法和最佳实践。

注入Mockito mock到Spring bean中

本文将展示如何使用依赖项注入将Mockito模拟插入到Spring bean中进行单元测试。

5的模拟方法

本教程演示了Mockito API的标准静态模拟方法的各种用法。

2.简单的间谍例子

让我们从一个简单的例子开始如何使用间谍

简单地说,API是Mockito.spy ()-监视一个真实的物体

这将允许我们调用对象的所有普通方法,同时仍然跟踪每个交互,就像我们对mock所做的那样。

好的,让我们做一个简单的例子,我们将监视一个存在的ArrayList对象:

@Test public void whenspyingonlist_threcert () {List List = new ArrayList();List spyList = Mockito.spy(List);spyList.add(“一”);spyList.add(“两个”);Mockito.verify阀门(spyList)(“一”);Mockito.verify阀门(spyList)(“两个”);assertequal (2, spyList.size ());}

请注意真正的方法add ()实际上是被称为以及大小如何spyList变成2。

3.的@Spy注释

接下来,让我们看看如何使用@Spy注释。我们可以使用@Spy注释,而不是间谍()如下面的例子:

@Spy List spyList = new ArrayList();@Test public void whenusingtheespyannotation_thenobjectisspied () {spyList.add(“一个”);spyList.add(“两个”);Mockito.verify阀门(spyList)(“一”);Mockito.verify阀门(spyList)(“两个”);assertequal (2, spyList.size ());}

为了使5注释(如@Spy,@Mock,…)-我们需要做以下之一:

  • 调用该方法MockitoAnnotations.initMocks(这)初始化带注释的字段
  • 使用内置跑动器@RunWith (MockitoJUnitRunner.class)

4.当间谍

现在-让我们看看如何去除间谍。我们可以使用与mock相同的语法配置/覆盖方法的行为。

在下面的例子中,我们使用doReturn ()覆盖的尺寸()方法:

@Test public void whenstubaspy_thenstubb () {List List = new ArrayList();List spyList = Mockito.spy(List);assertequal (0, spyList.size ());Mockito.doReturn(100)当(spyList) .size ();assertequal(100年,spyList.size ());}

5.模拟vs。间谍在5

现在,让我们来讨论两者的区别模拟间谍在Mockito -不是两个概念之间的理论差异,只是他们如何在Mockito本身不同。

当Mockito创建一个mock时-它从,而不是来自实际实例。mock简单地创建一个简单的shell实例的类,完全仪器,以跟踪与它的交互。

另一方面,间谍将包装一个现有的实例。它仍将以与普通实例相同的方式运行——唯一的区别是,它还将被插装以跟踪与它的所有交互。

在下面的例子中,我们创建模拟ArrayList类:

@Test public void whenCreateMock_thenCreated() {List mockedList = Mockito.mock(ArrayList.class);mockedList.add(“一”);Mockito.verify阀门(mockedList)(“一”);assertequal (0, mockedList.size ());}

正如我们所看到的——向模拟列表中添加一个元素实际上并没有添加任何东西——它只是调用了该方法,没有其他副作用。

另一方面,间谍会有不同的行为——它实际上会叫真正的实现添加方法并将元素添加到基础列表中:

@Test public void whenCreateSpy_thenCreate() {List spyList = Mockito。间谍(新ArrayList ());spyList.add(“一”);Mockito.verify阀门(spyList)(“一”);assertequal (spyList.size ());}

6.理解5NotAMockException

在最后一节中,我们将学习Mockito金宝搏官网188beNotAMockException这种异常是我们在误用模拟或间谍时可能遇到的常见异常之一

让我们先看看在什么情况下会发生这种异常:

List List = new ArrayList();Mockito.doReturn(100)当(列表).size ();assertEquals("大小应该是100:",100,list.size());

当我们运行这个代码片段时,我们会得到以下错误:

传递给when()的参数不是一个mock!正确的存根示例:doThrow(new RuntimeException()).when(mock).someMethod();

幸运的是,从Mockito错误消息可以很清楚地看出这里的问题所在。在我们的例子中列表对象不是一个mock对象。的5当()方法期望模拟对象或间谍对象作为参数

正如我们还可以看到的,Exception消息甚至描述了正确的调用应该是什么样的。现在我们对问题有了更好的理解,让我们按照建议来修复它:

最终列表 spyList = Mockito。间谍(新ArrayList <字符串> ());Mockito.doReturn(100)当(spyList) .size ();assertEquals("大小应该是100:",100,spyList.size());

我们的示例现在的行为与预期一致,我们不再看到MockitoNotAMockException。

7.结论

在这篇快速文章中,我们讨论了使用Mockito间谍的最有用的例子。

我们学习了如何创建一个间谍,如何使用@Spy注释,如何存根间谍最后,两者的区别模拟间谍

所有这些例子的实现可以找到在GitHub

这是一个Maven项目,所以它应该很容易导入和运行。

当然,为了更多的Mockito善行,在这里看看这个系列

通用的底部

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
2评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!