用莫比托嘲笑超载的梅特胡斯



我正在测试一些依赖于RestTemplate类中getForObject()方法的方法。

getForObject() 方法重载了签名getForObject(String url, Class<T> responseType, Object... uriVariables)getForObject(String url, Class<T> responseType, Map<String, ?>

我需要在其参数中存根带有 Object... 的方法以引发异常,但我不能,因为它也包含Map类型Mockito.any()。 因此,将方法存根为 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 .

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

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

相关内容

  • 没有找到相关文章

最新更新