当前位置: 首页 > article >正文

Java 中使用Mockito 模拟对象的单元测试的快速示例

Mockito是一个流行的Java模拟框架,它允许你在单元测试中创建和配置模拟对象,以便在测试过程中替换那些不容易构造或获取的对象。
Mockito可以与JUnit无缝集成,下面的示例演示 Mockito + JUnit实现模拟对象的单元测试。

依赖导入

这里使用Maven进行依赖的管理, 在pom.xml 中需要导入JUnit 和Mockito相关的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.osxm.test.javaut</groupId>
    <artifactId>java-unittest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <junit.jupiter.version>5.11.0</junit.jupiter.version>
        <junit.platform.version>1.9.3</junit.platform.version>
        
    </properties>


    <dependencies>  
        <!-- JUnit Jupiter API for writing tests -->  
        <dependency>  
            <groupId>org.junit.jupiter</groupId>  
            <artifactId>junit-jupiter-api</artifactId>  
            <version>${junit.jupiter.version}</version>  

            <scope>test</scope>  
        </dependency>  
  
        <!-- JUnit Jupiter Engine for executing tests -->  
        <dependency>  
            <groupId>org.junit.jupiter</groupId>  
            <artifactId>junit-jupiter-engine</artifactId>  
            <version>${junit.jupiter.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- (Optional) Only required to run tests in an IDE   
             without built-in support for JUnit 5
        <dependency>  
            <groupId>org.junit.platform</groupId>  
            <artifactId>junit-platform-launcher</artifactId>  
            <version>${junit.platform.version}</version>  
            <scope>test</scope>  
        </dependency>   -->  

        <!-- Mockito核心依赖 -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>5.14.2</version>
            <scope>test</scope>
        </dependency>

         <!-- 如果需要Mockito的JUnit集成,可以添加以下依赖 -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>5.14.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>  

</project>
  • junit-jupiter-api : 在写测试的时候需要导入的一些JUnit 的类
  • junit-jupiter-engine 运行JUnit 测试的引擎
  • junit-platform-launcher 一般不需要导入,用于在不内置支持JUnit5的IDE运行
  • mockito-core ,Mockito核心依赖 ,包括mockito的一些类和注解。
  • mockito-junit-jupiter: Mockito与JUnit的集成

源代码

MyService 是一个服务类 ,它依赖于MyDependency。 在MyServicemyServiceMethod 方法中会调用 MyDependency getData() 方法。

/**
 * Copyright (C)  Oscar Chen(XM):
 * 
 * Date: 2024-11-10
 * Author: XM
 */
package com.osxm.test.mock;

public class MyService {
    private MyDependency myDependency;
 
    // 构造函数注入依赖
    MyService(MyDependency myDependency) {
        this.myDependency = myDependency;
    }
 
    // 被测试的方法
    String myServiceMethod() {
        String data = myDependency.getData();
        return "processed " + data;
    }
}

/**
 * Copyright (C)  Oscar Chen(XM):
 * 
 * Date: 2024-11-10
 * Author: XM
 */
package com.osxm.test.mock;

public class MyDependency {
    String getData() {
        // 真实实现,但在测试中会被模拟
        return "real data";
    }
}

Mock 单元测试

Mock的单元测试代码如下:

/**
 * Copyright (C)  Oscar Chen(XM):
 * 
 * Date: 2024-11-10
 * Author: XM
 */
package com.osxm.test.mock;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

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 MyServiceTest {

    @Mock
    private MyDependency myDependency; // 创建一个模拟对象

    @InjectMocks
    private MyService myService; // 创建一个被测试对象,并注入模拟对象

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this); // 初始化模拟对象
    }

    @Test
    void testMyServiceMethod() {
        // 设置模拟对象的行为
        when(myDependency.getData()).thenReturn("mocked data");
 
        // 调用被测试对象的方法
        String result = myService.myServiceMethod();
 
        // 验证结果
        assertEquals("processed mocked data", result);
 
        // 验证模拟对象的方法是否被调用
        verify(myDependency).getData();
    }
}

在测试中,

  • 使用@Mock注解来创建MyDependency的模拟对象,
  • 并使用@InjectMocks注解来创建MyService的实例,同时将模拟对象注入其中。
  • 然后,使用whenthenReturn方法来设置模拟对象的行为
  • 最后调用被测试对象的方法并验证结果和交互。

请注意,上述示例中的MockitoAnnotations.openMocks(this)方法是在JUnit 5中初始化Mockito注解的推荐方式。如果你使用的是JUnit 4,则应使用MockitoAnnotations.initMocks(this)方法。此外,如果使用的是@RunWith(MockitoJUnitRunner.class)注解来运行测试,则无需手动调用初始化方法,因为MockitoJUnitRunner会自动处理。

运行

在VS Code中运行的效果如下:

在这里插入图片描述


http://www.kler.cn/a/388315.html

相关文章:

  • docker运行ActiveMQ-Artemis
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • Matlab自学笔记四十一:介绍日期时间型的显示格式:年‘y‘ 月‘M‘ 日‘d‘ 周‘e‘ 时‘h‘ 分‘m‘ 秒‘s‘
  • Docker入门系列——Docker-Compose
  • yolov7论文翻译
  • ESLint 使用教程(七):ESLint还能校验JSON文件内容?
  • 青少年编程能力等级测评CPA试卷(2)Python编程(一级)
  • 【Rust练习】20.进一步深入特征
  • [NewStar 2024] week5完结
  • Python--案例练习
  • 9. 基于 Redis 实现排行榜功能
  • jenkins提交gitee后自动部署
  • 小程序源码-模版 100多套小程序(附源码)
  • dolphin 配置data 从文件导入hive 实践(一)
  • 【Rust实现命令模式】
  • java---认识异常(详解)
  • 游戏引擎学习第三天
  • 2025 年使用 Python 和 Go 解决 Cloudflare 问题
  • 编程语言哪家强?对比C,C++,Java等语言的区别
  • 3DGS与NeRF的区别
  • 爬虫学习8
  • 【Promise】自定义promise
  • 机器学习Housing数据集
  • Android Studio 将项目打包成apk文件
  • Mac打开time machine(时间机器)备份特殊文件
  • ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)