java - 用 Mockito 模拟重载的方法
问题描述
我正在测试一些依赖于类中getForObject()
方法的方法RestTemplate
。
该getForObject()
方法重载了签名getForObject(String url, Class<T> responseType, Object... uriVariables)
和getForObject(String url, Class<T> responseType, Map<String, ?>
我需要Object...
在其参数中存根该方法以引发异常,但我不能因为Mockito.any()
也包含该Map
类型。因此,将方法存根getForObject(Mockito.anyString(),Mockito.any(), Mockito.any()
将指向触发编译错误的两个方法。
这个问题有没有可能的解决方法?
我已经尝试使用Mockito.anyObject()
无济于事
解决方案
不确定您的问题可能是什么,但此时我不妨发布一个工作示例。
如前所述,您需要正确指定每个参数的类型,以便 mockito 可以定位到匹配的方法签名。
有关处理旧 mockito 版本使用的可变参数的语法,请检查this answer
.
import static org.mockito.ArgumentMatchers.any;
...
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Test
public void test() throws Exception {
RestTemplate api = Mockito.mock(RestTemplate.class);
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Mockito.when(api.getForObject(any(String.class),any(Class.class), ArgumentMatchers.<Object>any())).thenReturn(obj1);
Mockito.when(api.getForObject(any(String.class),any(Class.class), any(Map.class))).thenReturn(obj2);
Mockito.when(api.getForObject(any(URI.class),any(Class.class))).thenReturn(obj3);
Assert.assertEquals(obj1, api.getForObject("", String.class));
Assert.assertEquals(obj1, api.getForObject("", String.class, obj1));
Assert.assertEquals(obj1, api.getForObject("", String.class, obj1, obj2));
Assert.assertEquals(obj1, api.getForObject("", String.class, obj1, obj2, obj3));
Assert.assertEquals(obj1, api.getForObject("", String.class, new Object[] {obj1,obj2,obj3}));
Assert.assertEquals(obj2, api.getForObject("", String.class, new HashMap()));
Assert.assertEquals(obj3, api.getForObject(new URI(""), String.class));
}
}
对于您的用例,只需将 替换thenReturn
为thenThrow
。
推荐阅读
- serialization - 如何序列化 JsonNode
- android - 无法使用 .getValue() 从 Firebase 中获取值
- c# - 如何在 C# 的另一个方法中使用已经实例化的类对象?
- templates - Ansible jinja2 模板
- vue.js - vuejs 声明全局解析错误意外令牌
- flutter - 在 Flutter 中使用 .then
- python - 无法将容器映像部署到 lambda 函数
- python - API调用中Python SMTP连接太慢
- python - 如何在本地网络上创建隐藏的 Python API 或网络请求(防止黑客检查网络流量)以管理计算机
- x86-64 - 如果商店井井有条,那还有什么意义呢?