如何在JUnit中正确模拟RabbitAdmin类

冬静酱_7112

冬静酱_7112

2026-07-04

801人浏览

原创

如何在JUnit中正确模拟RabbitAdmin类

本文详解如何避免因链式调用未充分模拟导致的nullpointerexception,通过分层mock properties对象,精准模拟rabbitadmin的getqueueproperties()行为。

本文详解如何避免因链式调用未充分模拟导致的nullpointerexception,通过分层mock properties对象,精准模拟rabbitadmin的getqueueproperties()行为。

在使用 Mockito 对 Spring AMQP 的 RabbitAdmin 进行单元测试时,直接对链式调用(如 rabbitAdmin.getQueueProperties("queue").get("QUEUE_MESSAGE_COUNT"))设置 stub,极易触发 NullPointerException。根本原因在于:@Mock RabbitAdmin rabbitAdmin 仅创建了顶层 mock 实例,其所有方法默认返回 null;而 getQueueProperties() 未被显式 stub,因此返回 null,后续 .get(...) 调用即在 null 上执行,抛出异常。

要正确模拟,必须逐层构建可信赖的返回值链。核心原则是:每个中间对象(如 Properties)也需被 mock 或实例化,并为其关键方法定义行为。

以下为推荐的完整解决方案(基于 JUnit 5 + Mockito 4+):

Image Creator
Image Creator

一款集成到Photoshop工作流中的AI图像生成插件,支持文字生图、图像生成与局部编辑等能力,辅助完成视觉设计。

下载
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import java.util.Properties;

import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class MyOriginalClassTest {

    @Mock
    private RabbitAdmin rabbitAdmin;

    @InjectMocks
    private MyOriginalClass classObj;

    @Test
    void testQueueMessageCount() {
        // Step 1: 创建并配置 Properties 的 mock
        Properties queueProps = mock(Properties.class);
        when(queueProps.get("QUEUE_MESSAGE_COUNT")).thenReturn(0L); // 注意:实际返回类型常为 Long

        // Step 2: 将 getQueueProperties("responseQueueName") 指向该 mock
        when(rabbitAdmin.getQueueProperties("responseQueueName")).thenReturn(queueProps);

        // Step 3: 执行被测逻辑(内部会调用 rabbitAdmin.getQueueProperties(...).get(...))
        int count = classObj.getMessageCount(); // 假设此方法含上述链式调用

        // Step 4: 验证结果与交互
        assertEquals(0, count);
        verify(rabbitAdmin).getQueueProperties("responseQueueName");
        verify(queueProps).get("QUEUE_MESSAGE_COUNT");
    }
}

✅ 关键注意事项:

  • 类型匹配:RabbitAdmin.getQueueProperties() 返回 Properties(继承自 Hashtable),其 get() 方法返回 Object,但 Spring AMQP 实际存入的 "QUEUE_MESSAGE_COUNT" 通常是 Long 类型,建议 thenReturn(0L) 而非 0,避免自动装箱/拆箱风险。
  • 避免过度 Mock:若 Properties 行为简单(仅读取固定键),也可用真实 new Properties() 实例替代 mock,更轻量:
    Properties props = new Properties();
    props.put("QUEUE_MESSAGE_COUNT", 0L);
    when(rabbitAdmin.getQueueProperties("responseQueueName")).thenReturn(props);
  • 通配符慎用:如需支持任意队列名,可用 anyString(),但应明确指定行为范围,防止测试脆弱:
    when(rabbitAdmin.getQueueProperties(anyString())).thenReturn(queueProps);
  • 验证完整性:务必 verify() 关键方法调用,确保被测代码确实触发了预期的 RabbitAdmin 交互。

总结:Mock 链式调用的本质是“模拟每一环”,而非仅 mock 最外层对象。遵循“声明 → 配置 → 组装 → 验证”四步法,即可稳健、清晰地完成 RabbitAdmin 的单元测试。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.13

4070

8

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

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

2023.10.23

2501

10

Java 单元测试
Java 单元测试

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

2025.10.24

946

26

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

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

2023.10.13

4070

8

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

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

2023.10.23

2501

10

Java 单元测试
Java 单元测试

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

2025.10.24

946

26

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

80

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
文心快码功能介绍
文心快码功能介绍

共0课时 | 0人学习

文心快码Agent使用手册
文心快码Agent使用手册

共0课时 | 0人学习

Fitten Code官方手册
Fitten Code官方手册

共0课时 | 0人学习