为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Mockito 模拟重载方法

使用 Mockito 模拟重载方法

沧海一幻觉 2023-05-17 16:06:37
我正在测试一些依赖于类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()无济于事
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

不确定您的问题可能是什么,但此时我不妨发布一个工作示例。

如前所述,您需要正确指定每个参数的类型,以便 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));

    }

}

对于您的用例,只需将thenReturnwith替换为thenThrow.


查看完整回答
反对 回复 2023-05-17
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

Varargs 可以表示为一个数组,所以你可以尝试这个以及指定第二个参数的确切类型:

getForObject(Mockito.anyString(),Mockito.any(Class.class), Mockito.any(Object[].class))


查看完整回答
反对 回复 2023-05-17
  • 2 回答
  • 0 关注
  • 349 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信