You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Mockito无法Mock函数:如何测试ManagerImpl的createMap方法

解决Android中Mockito无法Mock同一类内部方法的问题

我来帮你搞定这个Mockito的Mock问题~你要测试creatMap()方法,但它调用了同一个类里的encodeBase64(),这时候普通的Mock对象没法满足需求,得用**Spy(部分Mock)**来实现,具体步骤如下:

核心思路

Spy可以让你在保留类真实方法逻辑的同时,Mock掉指定的内部方法。我们需要让creatMap()执行真实代码,同时让encodeBase64()返回我们预设的Mock值。

具体实现步骤

1. 创建ManagerImpl的Spy实例

不同于普通的mock(ManagerImpl.class),Spy是基于真实对象创建的:

ManagerImpl managerSpy = Mockito.spy(new ManagerImpl());

2. Mock encodeBase64()方法的返回值

这里要使用doReturn()语法,避免触发真实方法的执行:

// 预设Mock的Base64返回值
String mockEncodedValue = "mocked_base64_string";
// 当encodeBase64被调用时,返回预设值
Mockito.doReturn(mockEncodedValue)
       .when(managerSpy)
       .encodeBase64(Mockito.any(byte[].class));

3. 执行测试并验证结果

调用creatMap()后,验证返回的Map是否符合预期:

try {
    HashMap<String, String> resultMap = managerSpy.creatMap("test_hint");
    // 验证encryptionKey对应的value是我们Mock的结果
    Assert.assertEquals(mockEncodedValue, resultMap.get(Schema.encryptionKey));
} catch (IOException e) {
    e.printStackTrace();
    Assert.fail("测试过程中抛出IOException");
}

额外注意事项

  • 修复代码笔误:你的creatMap()方法最后返回的是map,但实际创建的是genericKeysMap,要改成return genericKeysMap;,否则会编译报错。
  • 确保依赖正确:在你的build.gradle中引入Mockito依赖(根据测试类型选择):
    // 本地单元测试
    testImplementation 'org.mockito:mockito-core:5.+'
    // 仪器化测试(运行在设备上)
    androidTestImplementation 'org.mockito:mockito-android:5.+'
    

内容的提问来源于stack exchange,提问作者Happy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:56:36