java之 junit4单元测试Mockito的使用【经典】

目录

一 mockito的使用

1.1 mockito介绍

1.2 坐标的引入

1.3 mockito的api说明

二  verify验证行为

2.1 验证行为

2.2 案例

2.2.1 案例代码

2.2.2  说明

三  打桩

3.1 打桩

3.2 api说明

3.3 返回值与没有返回值

3.4 综合案例

3.5 案例抛出异常场景的单测

3.5.1 有返回值方法抛出异常

3.5.2 返回值方法抛出异常2

3.5.3 案例无返回值抛出异常

3.6无返回值的mock调用

 3.7 mock方法参数的要求*

3.8 回调打桩

四  静态类的mock

4.1 静态类的打桩

4.1.1 有返回值

4.1.2 无返回值

4.1.3 综合案例:方法中有工具类的静态方法

五   常用注解

5.1 @mock注解

5.1.1 使用junit4 语法

5.1.2 使用junit5语法

5.2 @mockBean注解

5.3 @InjectMock注解

六  spy注解的作用

6.1 spy

6.2 spy与mock的区别

6.3 spy的案例代码


一 mockito的使用

1.1 mockito介绍

Mockito是一个用于Java单元测试的mock框架,用于创建模拟对象(mock object)来替代真实对象,帮助开发者隔离外部依赖,从而专注于单元测试的逻辑,Mockito通常配合单元测试框架(如JUnit)使用。

1.2 坐标的引入

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

注意:Spring Boot Test 默认集成了 Mockito。无需再重复引入。

1.3 mockito的api说明

1.创建mock对象:使用mock()创建mock对象。

2.打桩:使用when()thenReturn()等方法指定mock对象的特定方法被调用时的行为(如返回值或抛出异常)。

3.验证行为:使用verify()检查mock对象的特定方法是否被调用,参数和调用次数是否符合预期。

1.4 特殊情况的单测

1.4.1 objectmapper

1.objectmapper

Map<String,Object>  resultMap  =  objectMapper.readValue(result,new TypeReference<Map<String,Object>(){})

2.对应的单测

导入包:

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.any;

when(objectMapper.readValue(eq(result), any(TypeReference.class))).thenReturn(resultMap);

二  verify验证行为

2.1 验证行为

使用verify()检查mock对象的特定方法是否被调用,参数和调用次数是否符合预期

Mockito 的 verify() 用于验证模拟对象的方法是否按预期被调用,包括调用次数、参数匹配等。它支持精确验证(如 times(2))、最少/最多次数(atLeast()/atMost())、未调用(never())及顺序验证(结合 InOrder)等,确保代码执行逻辑正确。

2.2 案例

2.2.1 案例代码

package com.ljf.services;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.List;

import static org.mockito.Mockito.*;

/**
 * @ClassName: MockTest
 * @Description: TODO
 * @Author: admin
 * @Date: 2025/08/17 17:19:09 
 * @Version: V1.0
 **/
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
    @Mock
    List<String> strList;
    @Test
    public void test(){
        strList.add("bj");
        strList.add("sh");
        strList.add("sz");
        // 模拟调用
     // 1. 验证方法被调用【恰好一次】(默认行为)
       verify(strList).add("bj");
  strList.add("bj");
    // 2. 验证方法被调用【指定次数】
    verify(strList, times(2)).add("bj"); // 精确2次

      // 3. 验证方法【从未调用】
     verify(strList, never()).clear();

// 4. 验证【调用顺序】
 InOrder inOrder = inOrder(strList);
 inOrder.verify(strList).add("bj");
 inOrder.verify(strList).add("sh");
 inOrder.verify(strList).add("sz");
        verifyNoMoreInteractions(strList);
    }
}

2.2.2  说明

验证单次调用:verify(strList).add("bj");→ 检查 add("bj") 被调用 1 次。
验证精确次数:verify(strList, times(2)).add("bj");→ 检查 add("bj") 被调用 2 次。
验证禁止调用:verify(strList, never()).clear();→ 确保 clear() 方法从未调用。
验证调用顺序:
 InOrder inOrder = inOrder(strList);
 inOrder.verify(strList).add("bj");
 inOrder.verify(strList).add("sh");
 inOrder.verify(strList).add("sz");

三  打桩

3.1 打桩

打桩:可以模拟数据库、网络请求等复杂或不可控的操作。无论调用多少次,一旦被打桩,方法将返回指定的值。模拟对象(Mock)的方法调用预设返回值或行为,使得测试代码可以隔离外部依赖,并控制方法的输出或异常

3.2 api说明

默认情况下,对于所有返回值的方法,mock对象将返回适当的默认值。例如,对于intInteger返回0,对于booleanBoolean返回false,对于集合类型返回空集合,对于其他对象类型(例如字符串)返回null

参数匹配器:使用 any()eq() 等灵活匹配参数,但需注意参数一致性(不能混用具体值和匹配器)。

覆盖规则:最后一次打桩会覆盖之前的定义(例如多次对 mock.get(0) 打桩,以最后一次为准)。

3.3 返回值与没有返回值

1.when(...).thenX() 适用于有返回值的方法。

2.doX().when(mock).method() 适用于 void 方法。

3.4 综合案例

package com.ljf.services;

import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.when;

/**
 * @ClassName: DaZhuangTest
 * @Description: TODO
 * @Author: admin
 * @Date: 2025/08/17 17:47:42 
 * @Version: V1.0
 **/
@RunWith(MockitoJUnitRunner.class)
public class DaZhua
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值