Mockito.any()传递与泛型的接口

时间:2011-10-27 14:41:15

标签: java generics mockito

是否可以通过泛型传递接口的类型?

界面:

public interface AsyncCallback<T>

在我的测试方法中:

Mockito.any(AsyncCallback.class)

放置<ResponseX>.class无法使用。

8 个答案:

答案 0 :(得分:235)

有一种类型安全的方法:使用ArgumentMatchers.any()并使用以下类型对其进行限定:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

作为pierrefevrier在评论中提到,Mockito的新版本是

Matchers.<AsyncCallback<ResponseX>>any()

答案 1 :(得分:53)

使用Java 8,由于增强的类型推断,您可以简单地使用any()(假设静态导入)而不使用参数或类型参数。编译器现在从目标类型(方法参数的类型)知道您实际意味着Matchers.<AsyncCallback<ResponseX>>any(),这是Java 8之前的解决方案。

答案 2 :(得分:14)

我必须采用以下机制来允许泛型:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

希望这有助于某人。

答案 3 :(得分:3)

将pierrefevrier评论作为答案发布,如果它出现在答案中而不是评论中,则可能会有用。

使用新版Mockito:(Matchers.<AsyncCallback<ResponseX>>any()

答案 4 :(得分:0)

如果你愿意,你可以投下它,添加抑制警告:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

如果Java允许'通用'泛型,他们可以使用这样的方法,这是你正在寻找的

private static <T, E> T<E> mock(Class<T<E>> clazz)

答案 5 :(得分:0)

除了thSoft的答案,将合格的调用放在方法中的any()意味着我可以删除资格,因为返回类型允许推理:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

答案 6 :(得分:0)

我在使用Spring Example时遇到了类似的问题:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

在这里,您必须使用限定符,b / c findAll方法可以采用多种类型,例如SortIterable。当然,您也可以将Mockito.any(Example.class)与类型安全警告一起使用。

答案 7 :(得分:0)

使用带有无参数 -------------------------------------------------------------------------------- ^ the beginning of the string -------------------------------------------------------------------------------- (?: group, but do not capture (optional (matching the most amount possible)): -------------------------------------------------------------------------------- @ '@' -------------------------------------------------------------------------------- ( group and capture to \1: -------------------------------------------------------------------------------- [\w-]* any character of: word characters (a- z, A-Z, 0-9, _), '-' (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of \1 -------------------------------------------------------------------------------- )? end of grouping -------------------------------------------------------------------------------- \s* whitespace (\n, \r, \t, \f, and " ") (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ( group and capture to \2: -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of \2 -------------------------------------------------------------------------------- $ before an optional \n, and the end of the string 方法的限定泛型类型有效(即 any()),但对于较长的泛型表达式可能会变得笨拙。另一种方法是在它自己的泛型方法中放置一个无参数的 ArgumentMatchers.<AsyncCallback<ResponseX>>any() 调用,使用特定的泛型类型作为返回类型:

any()

用法

private static <T> AsyncCallback<T> anyAsyncCallback() {
  return ArgumentMatchers.any()
}