0

0

使用 Mockito 进行单元测试时thenReturn()失效的解决方案

碧海醫心

碧海醫心

发布时间:2025-10-13 11:32:40

|

925人浏览过

|

来源于php中文网

原创

使用 mockito 进行单元测试时thenreturn()失效的解决方案

本文旨在解决在使用 Mockito 框架进行单元测试时,thenReturn() 方法无法正常工作,导致模拟对象返回空值的问题。通过示例代码和详细步骤,帮助开发者正确配置和使用 Mockito,确保单元测试的有效性。

在使用 Mockito 进行单元测试时,经常会遇到 thenReturn() 方法失效,导致模拟对象返回 null 的情况。这个问题通常是由于 Mockito 的初始化不正确导致的。下面将详细介绍如何正确配置和使用 Mockito,解决 thenReturn() 失效的问题。

问题分析

当 loginDao.getAdminDetails(anyString(), anyString()) 返回 null,并且抛出 UnnecessaryStubbingException 异常时,说明 Mockito 没有正确地初始化 Mock 对象,或者 Mock 对象没有被正确地注入到被测试的类中。

解决方案

解决这个问题的关键在于正确初始化 Mockito 的 Mock 对象,并将它们注入到被测试的类中。以下是两种常用的解决方案:

1. 使用 MockitoAnnotations.initMocks(this)

这种方法需要在测试类的 setUp 方法中使用 MockitoAnnotations.initMocks(this) 来初始化 Mockito。这会扫描测试类中所有带有 @Mock 注解的字段,并创建它们的 Mock 对象。同时,它还会扫描带有 @InjectMocks 注解的字段,并将 Mock 对象注入到这些字段中。

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

下载
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.servlet.ModelAndView;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

class LoginControllerTest {

    @InjectMocks
    LoginController loginController;

    @Mock
    CustomerDao customerDao;

    @Mock
    Customer customer;

    @Mock
    InvoiceDao invoiceDao;

    @Mock
    DashboardDao dashboardDao;

    @Mock
    LoginDao loginDao;

    @Mock
    Admin admin;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void testLogin() throws Exception {

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setParameter("password", "pass");
        request.setParameter("username", "uname");

        when(loginDao.getAdminDetails(anyString(), anyString())).thenReturn(admin);

        ModelAndView modelAndView = loginController.login(request, response);
        assertNotNull(modelAndView);
    }
}

注意事项:

  • 确保在测试方法执行之前调用 MockitoAnnotations.initMocks(this)。
  • 将 setUp 方法使用 @BeforeEach 注解标记,以确保在每个测试方法执行之前都会执行初始化操作。

2. 使用 JUnit Runner 初始化 Mockito

另一种方法是使用 JUnit 提供的 Runner 来初始化 Mockito。这可以通过在测试类上添加 @RunWith(MockitoJUnitRunner.class) 注解来实现。

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.servlet.ModelAndView;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
class LoginControllerTest {

    @InjectMocks
    LoginController loginController;

    @Mock
    CustomerDao customerDao;

    @Mock
    Customer customer;

    @Mock
    InvoiceDao invoiceDao;

    @Mock
    DashboardDao dashboardDao;

    @Mock
    LoginDao loginDao;

    @Mock
    Admin admin;

    @Test
    void testLogin() throws Exception {

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        request.setParameter("password", "pass");
        request.setParameter("username", "uname");

        when(loginDao.getAdminDetails(anyString(), anyString())).thenReturn(admin);

        ModelAndView modelAndView = loginController.login(request, response);
        assertNotNull(modelAndView);
    }
}

注意事项:

  • 确保添加了 org.mockito.junit.MockitoJUnitRunner 依赖。
  • 这种方法不需要显式调用 MockitoAnnotations.initMocks(this),JUnit 会自动完成初始化。

示例代码解释

  • @InjectMocks 注解:用于标记需要注入 Mock 对象的类,例如 LoginController。
  • @Mock 注解:用于标记需要创建 Mock 对象的类,例如 LoginDao 和 Admin。
  • when(loginDao.getAdminDetails(anyString(), anyString())).thenReturn(admin):这行代码用于指定当调用 loginDao.getAdminDetails() 方法时,返回 admin 对象。anyString() 方法表示匹配任何字符串参数。
  • assertNotNull(modelAndView):这行代码用于断言 login() 方法返回的 ModelAndView 对象不为空。

总结

通过正确初始化 Mockito,并使用 @Mock 和 @InjectMocks 注解,可以有效地解决 thenReturn() 方法失效的问题。选择哪种初始化方式取决于个人偏好和项目需求。 无论选择哪种方法,都需要确保 Mock 对象被正确地创建和注入到被测试的类中,才能保证单元测试的有效性。 此外,确保你的 Mockito 和 JUnit 版本兼容,避免因版本问题导致初始化失败。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

439

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

299

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

19

2025.10.24

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1495

2023.10.24

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号