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
相关产品推荐
相关产品推荐

