mock 单元测试模拟数据

前言

作为一个程序员,我们工作不可缺少的就是单元测试,当我们依赖第三方时,而三方还没有接口数据给我们时,这时候需要我们mock数据了

正文

what

作为一个单元测试,独立且完整是核心,完整性如何保证,这时候就需要mock了, Mock 框架可以很好的将被测功能与其他功能隔离开,市面上有很多的 Mock 框架,比如 Mockito、Jmock、easyMock 等。借助这些工具我们可以很轻松的 Mock 出我们想要的依赖。
Mockito 是一个针对 Java 的单元测试模拟框架,它与 EasyMock 和 jMock 很相似;
为了简化单元测试过程中测试上下文 ( 或者称之为测试驱动函数以及桩函数 ) 的搭建而开发的工具。
在有这些模拟框架之前,为了编写某一个函数的单元测试,程序员必须进行十分繁琐的初始化工作,以保证被测试函数中使用到的环境变量以及其他模块的接口能返回预期的值,有些时候为了单元测试的可行性,甚至需要牺牲被测代码本身的结构。
单元测试模拟框架则极大的简化了单元测试的编写过程:在被测试代码需要调用某些接口的时候,直接模拟一个假的接口,并任意指定该接口的行为。
这样就可以大大的提高单元测试的效率以及单元测试代码的可读性。

How

如何实现Mock对象?

使用mock对象进行测试的时候,我们总共需要3个步骤,分别是:

----- 使用一个接口来描述这个对象

----- 为产品代码实现这个接口

----- 以测试为目的,在mock对象中实现这个接口

use

springboot+mokito 实例

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

SpringBoot 测试支持由两个模块提供:

spring-boot-test 包含核心项目
spring-boot-test-autoconfigure 支持测试的自动配置
通常我们只要引入 spring-boot-starter-test 依赖就行,它包含了一些常用的模块 Junit、Spring Test、AssertJ、Hamcrest、Mockito 等
SpringBoot 使用了 Junit4 作为单元测试框架,所以注解与 Junit4 是一致的。

常用注解

@Mock:用于模拟对象, 有助于最大程度地减少重复的模拟对象。由于参数名称(字段名称)用于标识模拟, 因此它使测试代码和验证错误更易于阅读。 @Mock批注在org.mockito包中可用。
以下代码段显示了如何使用@mock批注:
@Mock
ToDoService servicemock;
注意:@Mock注释始终与@RunWith注释一起使用。
@RunWith:这是一个类级别的注释。它用于保持测试干净并改善调试。它还会检测测试中可用的未使用的存根, 并使用@Mock注释对模拟进行初始化。 @RunWith批注在org.mockito.junit包中可用。
以下代码段显示了如何使用@RunWith批注:
@RunWith(MockitoJUnitRunner.class)
public class ToDoBusinessMock {

}
在上面的代码片段中, MockitoJUnitRunner类用于检查是否创建了所有模拟并在需要时自动装配。
@InjectMocks:它标记应在其上执行注入的字段或参数。它允许速记模拟和间谍注入, 并最大程度地减少重复的模拟和间谍注入。在Mockito中, 通过setter注入, 构造函数注入和属性注入来注入模拟。 @InjectMocks批注在org.mockito包中可用。
以下代码段显示了如何使用@InjectMocks批注:
@InjectMocks
ToDoBusiness business;
@Captor:它允许创建字段级参数捕获器。它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。像其他批注一样, org.mockito包中也提供了@Captor批注。
以下代码段显示了如何使用@Captor批注:
@Captor
ArgumentCaptor argumentCaptor;
@Spy-允许创建部分模拟的对象。换句话说, 它允许将现场实例快速包装在间谍对象中。与其他注释一样, org.mockito包中也提供了@Spy注释。
以下代码段显示了如何使用@Spy批注:
@Spy
ArrayList arraylistSpy;
注意:@mock()与@InjectMocks
被@Mock标注的对象会自动注入到被@InjectMocks标注的对象中

常用方法

在这里插入图片描述

缺点

对private/static/final方法的Mock(模拟)

PowerMock

PowerMock是对EasyMock和mockito的扩展,实现mockito不具备的功能,比如mock静态方法

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>

总结

让我们一起来mock 数据吧

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值