准备

在我们进一步讨论之前,让我们探索几种不同的方法来启用Mockito测试中注释的使用。

方式一 MockitoJUnitRunner

我们拥有的第一个选择是使用MockitoJUnitRunner注释JUnit测试,如以下示例所示:

@RunWith(MockitoJUnitRunner.class)
public class MockitoAnnotationTest {
...
}

方式二 MockitoAnnotations.initMocks()

另外,我们也可以通过调用MockitoAnnotations.initMocks()来以编程方式启用Mockito注释:

@Before
public void init() {
MockitoAnnotations.initMocks(this);
}

方式三 MockitoJUnit.rule()

或者,我们可以使用MockitoJUnit.rule(),如下所示:

public class MockitoInitWithMockitoJUnitRuleUnitTest {

    @Rule
public MockitoRule initRule = MockitoJUnit.rule(); ...
}

在这种情况下,我们必须记住将Rule成员设置为public。


Mockito注解介绍

@Mock Annotation

Mockito中使用最广泛的注释是@Mock。我们可以使用@Mock来创建和注入模拟实例,而不必手动调用Mockito.mock。

在下面的示例中–我们将使用手动方式创建模拟ArrayList,而不使用@Mock注释:

@Test
public void whenNotUseMockAnnotation_thenCorrect() {
List mockList = Mockito.mock(ArrayList.class); mockList.add("one");
Mockito.verify(mockList).add("one");
assertEquals(0, mockList.size()); Mockito.when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}

现在我们将做同样的事情,但是我们将使用@Mock注释注入模拟:

@Mock
List<String> mockedList; @Test
public void whenUseMockAnnotation_thenMockIsInjected() {
mockedList.add("one");
Mockito.verify(mockedList).add("one");
assertEquals(0, mockedList.size()); Mockito.when(mockedList.size()).thenReturn(100);
assertEquals(100, mockedList.size());
}

请注意,在两个示例中,我们如何与模拟对象进行交互并验证其中的某些交互,只是为了确保模拟行为正确。

@Spy Annotation

现在–让我们看看如何使用@Spy注释监视现有实例。

在下面的示例中,我们使用旧方法创建一个列表的spy,而不使用@spy注释:

@Test
public void whenNotUseSpyAnnotation_thenCorrect() {
List<String> spyList = Mockito.spy(new ArrayList<String>()); spyList.add("one");
spyList.add("two"); Mockito.verify(spyList).add("one");
Mockito.verify(spyList).add("two"); assertEquals(2, spyList.size()); Mockito.doReturn(100).when(spyList).size();
assertEquals(100, spyList.size());
}

现在让我们做同样的事情–在列表上监视–但是使用@spy注释:

@Spy
List<String> spiedList = new ArrayList<String>(); @Test
public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() {
spiedList.add("one");
spiedList.add("two"); Mockito.verify(spiedList).add("one");
Mockito.verify(spiedList).add("two"); assertEquals(2, spiedList.size()); Mockito.doReturn(100).when(spiedList).size();
assertEquals(100, spiedList.size());
}

请注意,像以前一样,我们在这里与间谍对象进行交互以确保其行为正确。在此示例中,我们:

  • 使用实际方法spiedList.add()将元素添加到spiedList。
  • 使用Mockito.doReturn()将spiedList.size()方法存根以返回100而不是2。

@Captor Annotation

接下来–让我们看看如何使用@Captor注释创建ArgumentCaptor实例。

在下面的示例中–我们使用旧方法创建ArgumentCaptor,而不使用@Captor注释:

@Test
public void whenNotUseCaptorAnnotation_thenCorrect() {
List mockList = Mockito.mock(List.class);
ArgumentCaptor<String> arg = ArgumentCaptor.forClass(String.class); mockList.add("one");
Mockito.verify(mockList).add(arg.capture()); assertEquals("one", arg.getValue());
}

现在,出于相同的目的,使用@Captor –创建一个ArgumentCaptor实例:

@Mock
List mockedList; @Captor
ArgumentCaptor argCaptor; @Test
public void whenUseCaptorAnnotation_thenTheSam() {
mockedList.add("one");
Mockito.verify(mockedList).add(argCaptor.capture()); assertEquals("one", argCaptor.getValue());
}

请注意,当我们取出配置逻辑时,测试如何变得更简单、更可读。

@InjectMocks Annotation

现在-让我们讨论如何使用@InjectMocks注释-将模拟字段自动注入到测试对象中。

在以下示例中,我们使用@InjectMocks将模拟wordMap注入MyDictionary dic:

@Mock
Map<String, String> wordMap; @InjectMocks
MyDictionary dic = new MyDictionary(); @Test
public void whenUseInjectMocksAnnotation_thenCorrect() {
Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); assertEquals("aMeaning", dic.getMeaning("aWord"));
}

这是MyDictionary类:

public class MyDictionary {
Map<String, String> wordMap; public MyDictionary() {
wordMap = new HashMap<String, String>();
}
public void add(final String word, final String meaning) {
wordMap.put(word, meaning);
}
public String getMeaning(final String word) {
return wordMap.get(word);
}
}

Notes

最后–这是有关Mockito注释的一些说明:

  • Mockito的注释将重复的模拟创建代码减至最少
  • 它们使测试更具可读性
  • @InjectMocks支持同时注入@Spy和@Mock实例

在本快速教程中,我们展示了Mockito库中注释的基础。

注:本文翻译自原文:https://www.baeldung.com/mockito-annotations ,并且在此基础上有改动。

junit Mockito使用入门的更多相关文章

  1. JUnit + Mockito 单元测试(二)

    摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...

  2. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  3. JUnit + Mockito 单元测试

    原 JUnit + Mockito 单元测试(二) 2015年01月05日 17:26:02 sp42a 阅读数:60755 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  4. 基于Springboot+Junit+Mockito做单元测试

    前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...

  5. Junit mockito 测试Controller层方法有Pageable异常

    1.问题 在使用MockMVC+Mockito模拟Service层返回的时候,当我们在Controller层中参数方法调用有Pageable对象的时候,我们会发现,我们没办法生成一个Pageable的 ...

  6. Junit mockito解耦合测试

    Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...

  7. Mockito框架入门教程(一)

    官网: http://mockito.org API文档:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html 项目源码:htt ...

  8. JUnit+Mockito结合测试Spring MVC Controller

    [本文出自天外归云的博客园] 概要简述 利用JUnit结合Mockito,再加上spingframework自带的一些方法,就可以组合起来对Spring MVC中的Controller层进行测试. 在 ...

  9. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

随机推荐

  1. 阿里大数据竞赛season1 总结

    关于样本测试集和训练集数量上,一般是选择训练集数量不小于测试集,也就是说训练集选取6k可能还不够,大家可以多尝试得到更好的效果: 2. 有人提出归一化方面可能有问题,大家可以查查其他的归一化方法,但是 ...

  2. LeetCode【面试题 16.17. 连续数列】

    ------------恢复内容开始------------ 题目描述 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5 ...

  3. cssy元素居中的方法有哪些?

    css的元素居中 各位小伙伴们在努力写网页的时候有没有遇到过这样的一个问题呢? 在写的时候发现他不居中,可是要分分钟逼死强迫症的啊! 别急,我来啦 哈哈哈 今天就带来三种css的元素居中的方法 第一种 ...

  4. 远程桌面协议RDP

    远程桌面协议RDP(Remove Desktop Protocol) 通过mstsc客户端远程连接计算机,并对其进行管理等操作. 与TELNET的区别在于,TELNET显示的是远程计算机的命令行窗口, ...

  5. JS逆向某网站登录密码分析

    声明: 本文仅供研究学习使用,请勿用于非法用途! 目标网站 aHR0cHM6Ly9hdXRoLmFsaXBheS5jb20vbG9naW4vaW5kZXguaHRt 今日目标网站是某知名支付网站,感觉 ...

  6. 使用Properties配置文件进行配置读取

    #使用Properties配置文件进行配置读取: 例如:有一个配置文件的内容如下: # setting.properties last_open_file=/data/hello.txt auto_s ...

  7. python复制多层目录下的文件至其他盘符对应的目录中

    一.需求 app打包需要打入一些H5进去,以便更快的加载页面.这些H5文件是散落在各个文件夹中的[如下列所示],偶尔各个文件夹还需新增文件,每次新增一个文件,需要改动jenkins上job脚本,比较麻 ...

  8. Java面试必问之Hashmap底层实现原理(JDK1.8)

    1. 前言 上一篇从源码方面了解了JDK1.7中Hashmap的实现原理,可以看到其源码相对还是比较简单的.本篇笔者和大家一起学习下JDK1.8下Hashmap的实现.JDK1.8中对Hashmap做 ...

  9. 【译】使用FormData对象

    系列文章说明 原文 FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对.它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据.其传输的数据格式和表单使用subm ...

  10. 精简TTF字体、FontPruner、汉字字体瘦身(非字蛛)

    20190726更新 标黄部分 网上比应用比较多的 字蛛 http://font-spider.org/ 本文使用了本机安装软件,得到瘦身后的 TTF 字体文件 准备工具: python : 我使用是 ...