应通过 Mock 隔离加密解密依赖,聚焦业务逻辑测试;可用 jest.mock 模拟模块或第三方库,按输入输出契约返回预设值,并校验调用参数。

在 JavaScript 单元测试中,当被测代码依赖复杂的加密解密逻辑(比如 AES 加密、RSA 签名、JWT 解析等),直接调用真实实现会导致测试变慢、不可控、难调试,甚至泄露密钥或触发安全策略。这时应通过 Mock 隔离这些外部依赖,让测试聚焦于业务逻辑本身。
用 Jest Mock 替换加密模块导出
如果加密逻辑封装在独立模块(如 cryptoUtils.js),最直接的方式是使用 Jest 的 jest.mock() 模拟整个模块:
- 在测试文件顶部调用
jest.mock('./cryptoUtils'),Jest 会自动用空对象替换该模块 - 再用
require('./cryptoUtils').encrypt = jest.fn().mockReturnValue('mocked-cipher')注入可控行为 - 确保 mock 在
beforeEach中重置,避免测试间状态污染
对第三方库(如 crypto-js、node-forge)打桩
若直接依赖 crypto-js 或浏览器 SubtleCrypto,不能简单 mock 模块路径(因它们常被 webpack/Node 内置处理)。推荐方式:
- 用
jest.mock('crypto-js', () => ({ AES: { encrypt: jest.fn(), decrypt: jest.fn() } }))手动定义返回结构 - 对
window.crypto.subtle,可在测试前用Object.defineProperty(global, 'crypto', { value: { subtle: { encrypt: jest.fn(), decrypt: jest.fn() } } })替换全局对象 - 注意:Node 环境下需用
globalThis.crypto或安装webcryptopolyfill 并 mock
按输入输出契约 Mock,而非实现细节
加密函数的 mock 应关注「协议行为」而非「算法正确性」。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 传入
{ data: 'hello', key: 'abc' }→ 固定返回'a1b2c3',便于断言后续流程是否收到预期密文 - 解密失败时 mock 抛出
new Error('DECRYPTION_FAILED'),验证错误分支处理逻辑 - 避免在 mock 中复现真实加盐、IV 生成等逻辑——那是集成测试的事
结合测试数据设计可预测的密文/明文对
为提升可读性,可在测试用例中显式声明「已知明文 → 已知密文」映射:
- 定义常量
const TEST_PLAINTEXT = 'user:123'; const MOCK_CIPHERTEXT = 'U2FsdGVkX1+...'; - 在 mock 中硬编码该映射:
encrypt.mockImplementation(() => MOCK_CIPHERTEXT) - 这样测试断言清晰:「调用 service.encrypt() 后,发送的请求体包含
MOCK_CIPHERTEXT」
不复杂但容易忽略:Mock 后务必校验加密函数是否被正确调用(参数是否含预期 key、格式是否合规),这比只测返回值更能暴露集成问题。

















