mockito单元测试示例

Mockito mocking framework provides different ways to mock a class. Let’s look at different methods through which we can mock a class and stub its behaviors.

Mockito模拟框架提供了模拟类的不同方法。 让我们看一下可以模拟类并存根其行为的不同方法。

Mockito模拟方法 (Mockito mock method)

We can use Mockito class mock() method to create a mock object of a given class or interface. This is the simplest way to mock an object.

我们可以使用Mockito类的mock()方法创建给定类或接口的模拟对象。 这是模拟对象的最简单方法。

package com.journaldev.mockito.mock;import java.util.List;import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;public class MockitoMockMethodExample {@SuppressWarnings("unchecked")@Testpublic void test() {// using Mockito.mock() methodList<String> mockList = mock(List.class);when(mockList.size()).thenReturn(5);assertTrue(mockList.size()==5);}}

We are using JUnit 5 to write test cases in conjunction with Mockito to mock objects.

我们使用JUnit 5与Mockito一起编写测试用例来模拟对象。

Mockito @模拟注解 (Mockito @Mock Annotation)

We can mock an object using @Mock annotation too. It’s useful when we want to use the mocked object at multiple places because we avoid calling mock() method multiple times. The code becomes more readable and we can specify mock object name that will be useful in case of errors.

我们也可以使用@Mock注释来模拟对象。 当我们想在多个地方使用模拟对象时,这很有用,因为我们避免了多次调用mock()方法。 代码变得更具可读性,我们可以指定模拟对象名称,以防出现错误。

When using @Mock annotation, we have to make sure that we call MockitoAnnotations.initMocks(this) to initialize the mocked object. We can do this in testing framework setup methods that are executed before the tests.

使用@Mock批注时,我们必须确保调用MockitoAnnotations.initMocks(this)来初始化MockitoAnnotations.initMocks(this)对象。 我们可以在测试之前执行的测试框架设置方法中执行此操作。

package com.journaldev.mockito.mock;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;public class MockitoMockAnnotationExample {@MockList<String> mockList;@BeforeEachpublic void setup() {//if we don't call below, we will get NullPointerExceptionMockitoAnnotations.initMocks(this);}@SuppressWarnings("unchecked")@Testpublic void test() {when(mockList.get(0)).thenReturn("JournalDev");assertEquals("JournalDev", mockList.get(0));}}

Mockito @InjectMocks批注 (Mockito @InjectMocks Annotation)

When we want to inject a mocked object into another mocked object, we can use @InjectMocks annotation. @InjectMock creates the mock object of the class and injects the mocks that are marked with the annotations @Mock into it.

当我们要将一个模拟对象注入另一个模拟对象时,可以使用@InjectMocks批注。 @InjectMock创建类的模拟对象,并将带有注解@Mock的模拟注入到该类中。

package com.journaldev.mockito.mock;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;public class MockitoInjectMockAnnotationExample {@MockList<String> mockList;//@InjectMock creates an instance of the class and //injects the mocks that are marked with the annotations @Mock into it.@InjectMocksFruits mockFruits;@BeforeEachpublic void setup() {//if we don't call below, we will get NullPointerExceptionMockitoAnnotations.initMocks(this);}@SuppressWarnings("unchecked")@Testpublic void test() {when(mockList.get(0)).thenReturn("Apple");when(mockList.size()).thenReturn(1);assertEquals("Apple", mockList.get(0));assertEquals(1, mockList.size());//mockFruits names is using mockList, below asserts confirm itassertEquals("Apple", mockFruits.getNames().get(0));assertEquals(1, mockFruits.getNames().size()); mockList.add(1, "Mango");//below will print null because mockList.get(1) is not stubbedSystem.out.println(mockList.get(1));}}class Fruits{private List<String> names;public List<String> getNames() {return names;}public void setNames(List<String> names) {this.names = names;}}

Mockito spy()用于部分模拟 (Mockito spy() for partial mocking)

If we want to mock only specific behaviors and call the real methods for unstubbed behaviors, then we can create a spy object using Mockito spy() method.

如果我们只想模拟特定的行为,并为未受干扰的行为调用真实的方法,则可以使用Mockito spy()方法创建一个间谍对象。

package com.journaldev.mockito.mock;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;import java.util.ArrayList;
import java.util.List;import org.junit.jupiter.api.Test;public class MockitoSpyMethodExample {@Testpublic void test() {List<String> list = new ArrayList<>();List<String> spyOnList = spy(list);when(spyOnList.size()).thenReturn(10);assertEquals(10, spyOnList.size());//calling real methods since below methods are not stubbedspyOnList.add("Pankaj");spyOnList.add("Meghna");assertEquals("Pankaj", spyOnList.get(0));assertEquals("Meghna", spyOnList.get(1));}}

Mockito @间谍注释 (Mockito @Spy Annotation)

We can use @Spy annotation to spy on an object. Let’s look at a simple example.

我们可以使用@Spy注释来监视对象。 让我们看一个简单的例子。

package com.journaldev.mockito.mock;import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;public class MockitoSpyAnnotationExample {@SpyUtils mockUtils;@BeforeEachpublic void setup() {MockitoAnnotations.initMocks(this);}@Testpublic void test() {when(mockUtils.process(1, 1)).thenReturn(5);//mocked methodassertEquals(5, mockUtils.process(1, 1));//real method called since it's not stubbedassertEquals(20, mockUtils.process(19, 1));}}class Utils{public int process(int x, int y) {System.out.println("Input Params = "+x+","+y);return x+y;}
}

Note that the @Spy annotation tries to call the no-args constructor to initialized the mocked object. If your class doesn’t have it then you will get the following error.

请注意,@ Spy注释会尝试调用no-args 构造函数以初始化模拟对象。 如果您的班级没有它,那么您将收到以下错误。

org.mockito.exceptions.base.MockitoException: Unable to initialize @Spy annotated field 'mockUtils'.
Please ensure that the type 'Utils' has a no-arg constructor.at com.journaldev.mockito.mock.MockitoSpyAnnotationExample.setup(MockitoSpyAnnotationExample.java:18)

Also, note that Mockito cannot instantiate inner classes, local classes, abstract classes, and interfaces. So it’s always a good idea to provide an instance to spy on. Otherwise real methods might not get called and silently ignored.

另外,请注意,Mockito无法实例化内部类,局部类,抽象类和接口。 因此,提供一个实例进行监视始终是一个好主意。 否则,实际的方法可能不会被调用并被静默忽略。

For example, if you specify a spy object as below:

例如,如果您指定一个间谍对象,如下所示:

@Spy
List<String> spyList;

You will notice that when you call add() or get() methods, real methods are not getting called. If you specify the spy object like below, then everything will work fine.

您会注意到,当您调用add()get()方法时,不会调用实际方法。 如果您指定如下所示的间谍对象,那么一切都会正常进行。

@Spy
List<String> spyList = new ArrayList<>();

摘要 (Summary)

Mockito mocking framework allows us to create mock object easily through different methods and annotations. We can also inject a mock object into another mock object, this is a very useful feature.

Mockito模拟框架允许我们通过不同的方法和注释轻松创建模拟对象。 我们还可以将一个模拟对象注入另一个模拟对象,这是一个非常有用的功能。

GitHub Repository.GitHub存储库中查看更多Mockito示例。

翻译自: https://www.journaldev.com/21866/mockito-mock-examples

mockito单元测试示例

mockito单元测试示例_Mockito模拟示例相关推荐

  1. mockito无效_Mockito模拟无效方法

    mockito无效 Most of the times Mockito when() method is good enough to mock an object's behavior. But w ...

  2. mockito 静态方法_Mockito模拟静态方法– PowerMock

    mockito 静态方法 Mockito allows us to create mock objects. Since static method belongs to the class, the ...

  3. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)

    作者|mghio 编辑|包包 前言  在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...

  4. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

    前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...

  5. mockito 单元测试_使用FizzBu​​zz和Mockito进行单元测试

    mockito 单元测试 我有时使用FizzBu​​zz向新手演示单元测试的基础. 尽管FizzBu​​zz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如模拟 . FizzBu​​ ...

  6. ajax 示例_通过示例了解挥发

    ajax 示例 我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 . 在此期间,我们遇到了许多棘手的并发问题. 许多问题是独特的,但是一种特殊类型的问题一直反复出现. 您可能已经猜到了–滥用 ...

  7. 记录学习Mockito单元测试的坑——空指针异常

    记录学习Mockito单元测试的坑--空指针异常 情况一 mockito-all依赖和mockito-core依赖同时引用时,可能会报空指针异常 正确引用 <!--导入junit单元测试依赖-- ...

  8. linux打桩数框架,Mockito 单元测试打桩神器

    last modified by coder4 , 2019/08/30 18:34:26 Mockito 单元测试打桩神器 单元测试 软件测试是软件质量保证的关健环节,代表了需求.设计和编码的最终检 ...

  9. 11. shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则

    shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则 文章目录 1.1 read详解 1.2 用法示例 1.3 while read ...

最新文章

  1. python 设计 实践_python实践设计模式(一)概述和工厂模式
  2. 一句话说清楚NodeJS中module.exports和exports的区别
  3. python socket tcp_python socket 模拟tcp通讯
  4. python全栈开发_day10_函数的实参和形参
  5. python之各种装饰器的使用
  6. python中回归拟合图_seaborn库:线性回归拟合图
  7. 关于firefox火狐中localStorage无法正常使用的问题
  8. virtualbox使用手记
  9. opecv-putText
  10. javascript对象概念大全
  11. 《Python数据分析实战》3 NumPy库
  12. win10 java jdk环境变量 配置
  13. Scale和Resolution的相互转换算法
  14. 博士申请 | 澳门科技大学李楠楠老师组招收2022秋季入学全奖博士生
  15. js/vue:video 视频播放器
  16. Google 搜索知识
  17. 《都挺好》一部黑码农的神剧!
  18. 正则将长数字转为英式写法(从后向前3个数字一个逗号)
  19. 唐诗页面爬取 --- 预研阶段
  20. 又一家云服务关停,这回是网易

热门文章

  1. 基于Altium Designer的4层PCB板的绘制
  2. Fedora9-ATI显卡Gnome环境下Amarok和EVA花屏现象理会及其处理责罚方法。
  3. [转载] Python round四舍五入精度缺失的解决
  4. [转载] 使用Python中的NLTK和spaCy删除停用词与文本标准化
  5. [转载] 使用Python处理Excel文件
  6. Nessus虚拟机的几个问题解决办法
  7. 算法复习——割点(洛谷3388)
  8. 从零开始——基于角色的权限管理01(补充)
  9. ASP.NET Web API 提升性能的方法实践
  10. 用户不在sudoers文件中的解决方法 .